- 每創建一個線程都要消耗內存,每個線程都有自己的棧空間(大約1 M),也就是說每創建一個線程,操作系統就會給該線程分配1 M的空間。而且當線程執行完時間片後需要把數據保存至內存或硬盤中,下一個線程執行時又要從內存或硬盤中取出對應自己的數據,這麼一存一取也很耗時間。這就是爲什麼線程開太多的話,會導致執行任務所花費的時間更多的原因。
- Thread和Runnable不是一對一的關係,而是一對多的關係。比如線程池裏的線程就總是有限個,但是Runnable卻可以有多個,丟給Thread執行。
- Thread的isInterrupted與static的interrupted的區別在於static方法調用後如果返回true,那麼內部會將該boolean值又改回false。而isInterrupted不會。
- Join方法可以讓兩個線程順序執行
- 當一個Thread調用sleep()或wait()方法後,若其它線程調用該線程的interrupt()的話,這兩個方法就會拋出InterruptedException。但是拋出異常後,它們又會把這個中斷標誌位重新置爲false。
- 線程A調用yield後,會從運行狀態轉爲就緒狀態。讓操作系統去調用其它的線程,當然操作系統可能又會再調起線程A
- 如果想在Runnable的run方法中中斷線程,可以如下:
class TestRunnable implements Runnable {
public void run() {
while(!Thread.currentThread().isInterrupted()) {
...
}
}
}
private synchronized void print() {//同步監視器是當前對象
...
}
private static synchronized void print() {//同步監視器是當前類的class對象
...
}
- Thread的yield和sleep不會釋放鎖。wait會釋放鎖
- Callable要學習下