執行緒的常用方法介紹
start()與run()
start() 啟動執行緒並執行相應的run()方法
run() 子執行緒要執行的程式碼放入run()方法
我們會發現,呼叫start()方法才是 啟動一個新的執行緒。呼叫run()方法只是主執行緒呼叫了一個類的一個普通方法。
getName()和setName()
getName() 獲取此執行緒的名字
setName() 設定此執行緒的名字
join()和yield()
yield() 暫停當前方法,釋放自己擁有的CPU,執行緒進入就緒狀態。它能讓當前執行緒由“執行狀態”進入到“就緒狀態”,從而讓其它具有相同優先順序的等待執行緒獲取執行權;但是,並不能保證在當前執行緒呼叫yield()之後,其它具有相同優先順序的執行緒就一定能獲得執行權;也有可能是當前執行緒又進入到“執行狀態”繼續執行!
class My_Thread extends Thread{ public synchronized void run() { for(int i = 0;i < 10;i++) { System.out.println(Thread.currentThread().getName()+" --進行-- "+i); if(i == 4) { Thread.currentThread().yield(); } } } } public class Test4 { public static void main(String[] args) { My_Thread my_Thread = new My_Thread(); my_Thread.setName("t1"); My_Thread my_Thread1 = new My_Thread(); my_Thread1.setName("t2"); my_Thread.start(); my_Thread1.start(); } }
yield方法也不會釋放同步鎖
class My_Thread extends Thread{ private static Object obj = new Object(); public void run() { synchronized (obj) { for(int i = 0;i < 10;i++) { System.out.println(Thread.currentThread().getName()+" --進行-- "+i); if(i == 4) { Thread.currentThread().yield(); } } } } } public class Test4 { public static void main(String[] args) { My_Thread my_Thread = new My_Thread(); my_Thread.setName("t1"); My_Thread my_Thread1 = new My_Thread(); my_Thread1.setName("t2"); my_Thread.start(); my_Thread1.start(); } }
從執行結果我們可以清楚的看到yield()方法並不會釋放同步鎖。
join() 加入執行緒(當前執行的執行緒是A執行緒,呼叫join()方法得是B執行緒) 當前執行緒阻塞 執行B執行緒 B執行結束之後A執行緒才能執行
放棄當前執行緒的執行
class My_Thread extends Thread{
public void run() {
for(int i = 0;i < 10;i++) {
System.out.println(Thread.currentThread().getName()+" --進行-- "+i);
}
}
}
public class Test4 {
public static void main(String[] args) {
My_Thread my_Thread = new My_Thread();
my_Thread.setName("t1");
my_Thread.start();
for(int i = 0;i < 10;i++) {
/**
* 在i等於1時,將t1執行緒加入,等待t1執行緒執行完,main執行緒才會繼續執行
*/
if(i == 1) {
try {
my_Thread.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+" --進行-- "+i);
}
}
}
interrupt()
interrupt() 中斷執行緒 由執行狀態到死亡狀態
* 中斷執行緒操作實質上是修改了一下中斷標示位為true
* 當前執行緒正在執行,僅僅修改標示位,不在做其他的事
* 當前執行緒正在阻塞,修改標識位,如果是join,sleep,yield,則會丟擲Interrup異常,修改標示位為false
setDaemon()
setDaemon(true) 設定當前執行緒為守護執行緒
* 守護執行緒和使用者執行緒最主要區別是守護執行緒脫離終端
* 當用戶 執行緒不在,只存在守護執行緒 JVM就不在了,JVM不在了之後守護執行緒也就不在了
getPriority()
getPriority() 獲取執行緒優先順序 1~10 預設值為5 優先順序越高被優先呼叫的頻率越高