1. 執行緒的優先順序
優先順序越高, 執行緒得到執行的機會就越高
thread中.
* static int max_priority
* 最高優先順序 10
* static int min_priority
* 子最低優先順序 1
* static int norm_priority
* 預設優先順序 5
2.執行緒的幾個方法
thread.sleep(long)
執行緒睡眠:使執行緒轉到阻塞狀態,當阻塞結束後轉為就緒狀態,等待執行
object.wait();
執行緒等待: 使當前正在執行的執行緒等待,直到被呼叫notify()/notifyall()時才有可能執行.
注意: 這裡的意思是讓出cpu,再次執行時 會在源讓出點開始繼續執行
thread.yield()
執行緒讓步: 暫停正在執行的執行緒,把執行權讓給其他優先順序更高的執行緒
注意: 這裡讓出後有可能再次搶奪cpu繼續執行
thread.join()
執行緒加入: 等待其他執行緒終止,然後在轉為就緒狀態等待執行
執行緒喚醒 : notify() notifyall() 喚醒再次物件上監聽的或所有的執行緒
3.sleep和yield區別
sleep使當前執行緒進入阻塞狀態,所以執行sleep的執行緒在指定時間
內肯定不會再次執行, yield 只是使當前執行緒重新回到就緒狀態
所以執行yield的執行緒有可能進入到就緒狀態後馬上又被執行
sleep可以執行阻塞時間,yield是不可設定的 yield是執行緒進入
就緒狀態後, cpu會先檢測當前是是否有相同或更高優先順序的執行緒
如有 則執行, 否則繼續執行原來的執行緒
sleep允許較低優先順序執行緒有執行的機會,單yield不會
在乙個執行系統中, 如果較高優先順序執行緒沒有呼叫sleep
又沒i/o阻塞,那麼較低執行緒只有等到較高執行緒結束後才能執行
4. join
public static void main(string args) }};
t1.start();
try catch (interruptedexception e)
thread t2 = new thread() }};
t2.start();
try catch (interruptedexception e)
system.out.println(thread.currentthread().getname() + " 主線程結束.");
}
main 主線程開始執行.
t1 running!
t1 running!
t1 running!
t1 running!
t1 running!
t1 running!
t1 running!
t1 running!
t1 running!
t1 running!
t2 running!
t2 running!
t2 running!
t2 running!
t2 running!
t2 running!
t2 running!
t2 running!
t2 running!
t2 running!
main 主線程結束.
5.wait notify 執行緒間等待與喚醒
剛開始這兩個概念比較蒙,他們都必須在synchronized中呼叫因為是基於物件鎖,只有在synchronized中才有物件鎖的概念
wait: 當前執行的執行緒放棄cpu資源 告訴其他監聽次物件鎖的執行緒可以執行了, 我等會再這地方繼續執行,注意:可以不出synchronized塊
notify: 喚醒其他正在等待這個物件鎖的執行緒可以繼續執行了,就是告訴他們我搞完了,你們可以搞了 注意: 即使呼叫了notify,也要等待出了synchronized後,其他執行緒才可以執行.
下例子一
兩個執行緒交替列印abababababab...
public class waitnotify_5 implements runnable
public static void main(string args)
@override
public void run() catch (interruptedexception e)
}} }
}
所以: 當a執行緒進入,獲得object鎖->列印->notify(雖然第一次沒有其他執行緒引鎖的等待,但沒關係,沒影響)喚醒->等待(卡住)
b執行緒進入-> 獲得object物件鎖(之前a wait釋放的)..........
例子二: 四個執行緒交替列印 abcdabcdabcd.......
public class waitnotify_6 implements runnable
private string name;
private object prev;
private object self;
private waitnotify_6(string name, object prev, object self)
@override
public void run()
try catch (interruptedexception e)
}} }
}
java多執行緒
在網上看到很有意思的問題,摘下來好好看下 在面試的時候被問了乙個多執行緒的問題 回來仔細思考了一下,多執行緒是否真的能提高了效率?我對多執行緒的理解就是 比如挖乙個隧道,有2種開工方法 1 只在山的一頭挖,直至挖到山的另一頭,從而打通隧道,這可以看成是單執行緒 2 在山的兩頭挖,同時開工,最後在山的...
Java 多執行緒
1。thread類和runnable介面 2。主線程 用thread的static thread currentthread 方法獲得 3。通過實現runnable介面建立執行緒 實現runnable介面的run方法。新執行緒在run 方法返回時結束。注意用這種方法建立程序時,在實現runnable...
JAVA 多執行緒
為hashmap的不正確使用所導致。hashmap在多執行緒環境下使用不安全。使用靜態hashmap作為聯絡人資料快取,key為手機號碼.private static maplxrdata new hashmap 多執行緒環境下不同步hashmap可能導致如下問題 1 多執行緒put操作後可能導致g...