Java執行緒中常用的方法

2021-08-16 04:07:58 字數 4216 閱讀 3891

當執行緒呼叫yield方法後,執行緒即從執行狀態變為可執行狀態,將cpu的執行權讓給同級別的執行緒;讓出cpu執行權之後,又同別的執行緒共同爭奪cpu的執行權。(可能釋放了cpu執行權之後 又搶到了;同時多執行緒之前是搶占cpu的,所以從執行結果上很難看出是否yield方法起了作用)

public class yielddemo extends thread 

} public static void main(string args)

class demo extends thread

} }}

執行結果:

---------0正在執行------

*****====0正在執行*****=

---------1正在執行------

*****====1正在執行*****=

---------2正在執行------

*****====2正在執行*****=

---------3正在執行------

*****====3正在執行*****=

---------4正在執行------

*****====4正在執行*****=

*****====5正在執行*****=

---------5正在執行------

使當前的執行緒休眠,狀態由執行態轉變為可執行態,讓出cpu執行權。等待休眠時間結束,再次執行。(執行緒雖然休眠了 但並沒有釋放鎖

舉例如下:

public class sleepdemo2  catch (interruptedexception e) }}

}, "執行緒1").start();

new thread(new runnable()

}}, "執行緒2").start();

}}

運**況如下:

測試sleep不會釋放鎖

等待sleep釋放鎖沒有指望了

等待呼叫該方法的執行緒執行完畢之後,再執行其他執行緒,其內部是wait實現的,因此它會釋放物件鎖

class runnableimpl implements runnable  catch (interruptedexception e) 	}}

class threadtest extends thread

@override

public void run() catch (interruptedexception ex)

system.out.println("releaseobjectlock");

} }}public class jointestdemo2 catch (interruptedexception e)

}}

運**況:

getobjectlock

begin sleep

end sleep

releaseobjectlock

joinfinish

wait導致當前的執行緒等待,直到其他執行緒呼叫此物件的notify()方法或notifyall()方法。會釋放物件鎖

notify隨意喚醒乙個等待的執行緒

nofityall將所有等待的執行緒均喚醒

可以使用三者構造乙個簡單的生產者和消費者場景

public class waitdemo 

class producer implements runnable catch (interruptedexception e)

}random random = new random();

int num = random.nextint();

list.add(num);

system.out.println("生產者生產資料:" + num);

list.notifyall();}}

} }class consumer implements runnable catch (interruptedexception e)

}system.out.println("消費了資料:" + list.remove());

list.notifyall();}}

} }}

中斷執行緒,將執行緒的狀態置為中斷(true),不影響執行緒的正常執行。當interrupt碰到了sleep、wait、join時會丟擲interruptedexception異常,並將中斷狀態清除(中斷狀態為false)。

isinterrupted()

測試執行緒是否已經中斷。

interrupted()

測試當前執行緒是否已經中斷。

上述兩個方法分別是判斷執行緒是否已經中斷,返回值true/false。但是兩個方法是有一定的區別的

首先給出兩個方法的實現:

public boolean isinterrupted() 

public static boolean interrupted()

private native boolean isinterrupted(boolean clearinterrupted);

兩個方法的共同點均是呼叫了本地方法isinterrupted,只是傳遞的引數不一樣。通過檢視引數 我們也能看出兩個方法的不同。clearinterrupted 清除中斷狀態(true清除,false不清除)

而isinterrupted()傳遞的是false,interrupted傳遞的是true

所以isinterrupted()只是單純的獲取執行緒的中斷狀態,而interrupted()方法 第一次呼叫獲取的是執行緒的中斷狀態,隨後清除中斷狀態(狀態置為false),第二次呼叫時中斷狀態為false

**展示:

public class interruptdemo implements runnable 

@override

public void run() catch (interruptedexception e)

}}

運**況:

isinterrupted:false

interrupted:false

in run() - interrupted while sleeping

主線程是否中斷:true

主線程是否中斷:false

主線程上述例子驗證了interrupted方法,但是為什麼isinterrupted方法返回的是false呀,明明中斷了呀?

還記得上面描述的嗎?當interrupt方法碰到sleep、wait、join即丟擲異常,清除中斷狀態(true-->false)。所以返回的是fasle

若想通過true、false判斷是否中斷執行緒,則需要再呼叫一次interrupt方法。

public class interruptdemo implements runnable 

@override

public void run() catch (interruptedexception e)

}}

運**況:

thread-0正在執行

主線程是否中斷:true

主線程是否中斷:false

主線程isinterrupted:true

interrupted:true

in run() - interrupted while sleeping

java中常用的String方法

1 length 字串的長度 string a hello word system.out.println a.length 輸出的結果是字串長度10。2 charat 擷取乙個字元 string a hello word system.out.println a.charat 1 輸出的結果是字串...

java中常用的String方法

1 length 字串的長度 string a hello word system.out.println a.length 輸出的結果是字串長度10。2 charat 擷取乙個字元 string a hello word system.out.println a.charat 1 輸出的結果是字串...

java 開發中常用方法

從list中拿出top指的條數資料 我有幾張阿里雲幸運券分享給你,用券購買或者公升級阿里雲相應產品會有特惠驚喜哦!把想要買的產品的幸運券都領走吧!快下手,馬上就要搶光了。取top x條產品類資料 param sourlist 產品類集合 param rowscount 條數 return list ...