JavaSE——線程通訊。本站提示廣大學習愛好者:(JavaSE——線程通訊)文章只能為提供參考,不一定能成為您想要的結果。以下是JavaSE——線程通訊正文
線程通訊:
假如線程A和線程B持有同一個MyObject類的對象object,這兩個線程會去調用不同的辦法,但是它們是同步執行的,比方:線程B需求等候線程A執行完了methodA()辦法之後,它才干執行methodB()辦法。這樣,線程A和線程B就完成了 通訊。
線程通訊中要用到的辦法:wait()辦法:
執行同步鎖(obj對象)的該辦法的線程進入梗塞形態,會釋放對象的鎖,java虛擬機把該線程放到該對象的等候池中,該線程假如要再次執行,則需求其他線程將它喚醒。
1 package tongxin; 2 3 public class MyThreadA extends Thread { 4 private Object obj; 5 public MyThreadA(String name,Object obj){ 6 7 super(name); 8 this.obj = obj; 9 10 } 11 public void run(){ 12 synchronized(obj){ //設置obj為同步鎖 13 14 for(int i = 0;i<10;i++){ 15 System.out.println(Thread.currentThread().getName()+"---"+i); 16 17 if(i == 5){ 18 try { 19 obj.wait(); 20 } catch (InterruptedException e) { 21 // TODO Auto-generated catch block 22 e.printStackTrace(); 23 } 24 try { 25 sleep(100); 26 } catch (InterruptedException e) { 27 // TODO Auto-generated catch block 28 e.printStackTrace(); 29 } 30 } 31 } 32 } 33 } 34 35 }
1 package tongxin; 2 3 public class Demo01 { 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 8 Object obj = new Object(); 9 MyThreadA mt1 = new MyThreadA("A",obj); 10 mt1.start(); 11 12 } 13 14 }
output:
1 A---0 2 A---1 3 A---2 4 A---3 5 A---4 6 A---5
當i = 5時,執行了同步鎖的wait()辦法,然後線程A將同步鎖釋放進入梗塞形態,假如A線程還有恢復運轉,則需求另一個持相反同步鎖的線程將其喚醒。
喚醒線程的辦法:notifi()
另一個線程在運轉進程中執行了同步鎖的notifi辦法, 會喚醒在對象的等候池中等候的一個線程(隨機選擇),java虛擬時機隨機選擇一個線程轉到對象的鎖池中。
留意一個線程要去喚醒另一個執行了wait()辦法進入梗塞形態的線程,則其要去執行同一個同步鎖的notifi()辦法。
假設有一個房間,A出來之後把門鎖上,A在房間裡睡著了,B要把A叫醒,就要用鎖(同步鎖)上的鑰匙把門開開。A與B用的是同一把鎖,只不過A是在鎖門(wait()辦法),B是在開門(notifi()辦法)。
1 package tongxin; 2 3 public class MyThreadB extends Thread { 4 private Object obj; 5 public MyThreadB(String name,Object obj){ 6 7 super(name); 8 this.obj = obj; 9 10 } 11 public void run(){ 12 synchronized(obj){ //設置obj為同步鎖 13 14 for(int i = 0;i<10;i++){ 15 System.out.println(Thread.currentThread().getName()+"---"+i); 16 17 if(i == 2){ 18 obj.notify(); 19 try { 20 sleep(100); 21 } catch (InterruptedException e) { 22 // TODO Auto-generated catch block 23 e.printStackTrace(); 24 } 25 } 26 } 27 } 28 } 29 30 31 }
1 package tongxin; 2 3 public class Demo01 { 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 8 Object obj = new Object(); 9 MyThreadA mt1 = new MyThreadA("A",obj); 10 MyThreadB mt2 = new MyThreadB("B",obj); 11 mt1.start(); 12 mt2.start(); 13 14 15 } 16 17 }
output:
A---0 A---1 A---2 A---3 A---4 A---5 B---0 B---1 B---2 B---3 B---4 B---5 B---6 B---7 B---8 B---9 A---6 A---7 A---8 A---9
創立一個新的線程對象B來喚醒A線程,運轉進程中,i = 2時,B喚醒A線程將其轉到對象的鎖池中,但此時由於B持有同步鎖所以B線程持續運轉,運轉完畢後釋放同步鎖,此時A獲取到同步鎖恢復運轉。
notifyAll()辦法:
該辦法會喚醒在這個對象鎖池中的一切線程。
如有不對之處還望指正,謝謝。