sleep()和wait()有什麼區別?
1)sleep()方法是線程類(Thread)的靜態方法,wait()方法是Object類的方法;
2)sleep()方法讓調用線程進入睡眠狀態,讓出執行機會給其他線程,但是監控狀態依然保持,時間到了自動恢復運行狀態,wait()會讓線程放棄對象鎖,進入等待此對象的等待鎖定池,只有notify()、notifyAll()方法纔會進入運行狀態;
3)調用sleep()方法的過程中,線程不會釋放對象鎖,而調用wait()方法的時候,線程會放棄對象鎖。
run()和start()有什麼區別?
start()是線程的啓動者,run()是線程任務的運行者。
每個線程都是通過Thread對應的run()方法來執行(線程體),通過調用Thread類的start()方法來啓動一個線程。
1)start()方法真正實現了多線程運行,調用 start() 方法來啓動線程時會自動調用 run();而直接調用 run() 方法就直接執行,達不到多線程運行的目的。
2)一個線程對線的 start() 方法只能調用一次,多次調用會拋出 java.lang.IllegalThreadStateException 異常;run() 方法沒有限制。
public class TestThreadRunStart {
private static void testRun(Thread t) {
t.run();
try {
Thread.sleep(1000);// 休眠1秒
System.out.println(">>>休眠1秒<<<");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private static void testStart(Thread t) {
t.start();
try {
Thread.sleep(1000);// 休眠1秒
System.out.println(">>>休眠1秒<<<");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Thread t = new Thread() {
@Override
public void run() {
// 休眠3秒
try {
Thread.sleep(3000);
System.out.println("===休眠3秒===");
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread running...");
}
};
//testRun(t);
/**
* ===休眠3秒===
* Thread running...
* >>>休眠1秒<<<
*/
testStart(t);
/**
* >>>休眠1秒<<<
* ===休眠3秒===
* Thread running...
*/
}
}
notify()和notifyAll()有什麼區別?
上文提過,如果線程調用了對象的wait()方法,那麼只有調用notifyAll()或notify()方法喚醒。
所以notifyAll()方法是喚醒所有wait線程,而notify()方法只隨機喚醒一個wait線程。也就是說,調用了notify只有一個線程會由等待池進入鎖池,而notifyAll會將該對象等待池內的所有線程移動到鎖池中,等待鎖競爭。
優先級高的線程競爭到對象鎖的概率大,假若某線程沒有競爭到該對象鎖,它還會留在鎖池中,唯有線程再次調用wait()方法,它纔會重新回到等待池中。而競爭到對象鎖的線程則繼續往下執行,直到執行完了 synchronized代碼塊,它會釋放掉該對象鎖,這時鎖池中的線程會繼續競爭該對象鎖。