【Java多執行緒併發總結】Thread類的常用方法(join、yield等)---執行緒的基礎操作篇
啟動(start)
最基本的操作,呼叫Runnable中的run方法,無返回值。
new Thread(new Test()).start();
休眠(sleep)
使當前執行緒休眠一段時間,預設為毫秒級,最高可以精確到納秒,呼叫的方法為sleep(long millis, int nanos)。
public void run() { try { Thread.sleep(1000); //休眠1000ms=1s } catch (InterruptedException e) { e.printStackTrace(); } }
當前執行緒(currentThread)
返回當前執行緒的例項。
Thread thread=Thread.currentThread();
join
等待當前執行緒終止,可以設定等待時間,當超過等待時間時放棄等待。
public class Main { public static void main(String[] args){ Thread thread1=new Thread(new Test()); Thread thread2=new Thread(new Test()); thread1.start(); try { thread1.join(); //此時等待thread1執行 } catch (InterruptedException e) { e.printStackTrace(); } thread2.start(); //當thread1執行完畢後執行 } }
設定優先順序(setPriority)
設定當前執行緒的優先順序,優先順序分三個等級最低優先順序MIN_PRIORITY、預設優先順序NORM_PRIORITY、最高優先順序MAX_PRIORITY
注意:這僅僅只是給系統一個暗示,並不能確保什麼
thread.setPriority(Thread.MIN_PRIORITY);
讓步(yield)
暫停當前執行緒,執行其他執行緒。
注意:這僅僅只是給系統一個暗示,它告訴系統我已經執行完我最重要部分,系統可以去把主要資源用於其他的執行緒,但是不能確定系統一定會答應,也不能確定系統什麼時候答應,所以我們在處理多執行緒的複雜操作時不應該依賴於yield。
Thread.yield();
設為後臺程序(setDaemon)
後臺程序執行在後臺,獨立於整個系統,當系統程序結束,也就是隻剩下後臺程序時,後臺程序退出。
thread.setDaemon(true);
中斷(interrupt)
中斷執行緒。
注意:它經常會因為它的名字被誤用,它雖然叫中斷,但是並不會中斷執行緒,實際上stop()方法有中斷執行緒的作用,現在stop已經嗝屁了,因為它的不安全性被java廢除,當然interrupt不能重蹈stop的覆轍,所以它只是給執行緒打上一個interrupt標記,通過Thread.interrupted可以獲取其中斷狀態,我們可以通過這個標記對當前執行緒進行處理。
如果當前執行緒沒有中斷它自己,則該執行緒的 checkAccess 方法就會被呼叫,這可能丟擲 SecurityException。
如果執行緒在呼叫wait() 方法,或者該類的join()、sleep()方法過程中受阻,則丟擲 InterruptedException。
如果該執行緒在可中斷的通道上的 I/O 操作中受阻,則該通道將被關閉,該執行緒的中斷狀態將被設定並且該執行緒將收到一個 ClosedByInterruptException。
如果該執行緒在一個 Selector 中受阻,則該執行緒的中斷狀態將被設定,它將立即從選擇操作返回,並可能帶有一個非零值,就好像呼叫了選擇器的 wakeup 方法一樣。
public class Test implements Runnable{
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("執行緒中斷");
return;
}
}
}
public class Main {
public static void main(String[] args){
Thread thread=new Thread(new RunTest());
thread.start();
thread.interrupt();
}
}
執行結果
java.lang.InterruptedException: sleep interrupted
執行緒中斷
at java.lang.Thread.sleep(Native Method)
at Test.run(Test.java:5)
at java.lang.Thread.run(Thread.java:745)
Process finished with exit code 0
已經過時的方法(stop、suspend、destroy)
他們分別是強行停止執行緒、強行掛起執行緒、破壞執行緒,但是現在他們已經被廢除,原因便是它們會導致死鎖或其他安全性問題。