Treead中使用wair() 和notify()
/*需求: 使用雙線程交替打印1,2,3,4....... eg: T11 ------->1 T22 ------->2 T11 ------->3 T22 ------->4 T11 ------->5 T22 ------->6 T11 ------->7 T22 ------->8 ....................
*可以看出來這里的雙線程是同步的* */
ps:我也是一個新手,有問題歡迎交流,780720038@qq.com
我直接貼代碼了 ,ceshi2.java

1 2 public class ceshi2 { 3 4 public static void main(String[] args) { 5 // TODO Auto-generated method stub 6 Number number =new Number(); 7 Thread t11 =new Thread(new T11(number)); //生成線程 8 Thread t22 =new Thread(new T22(number)); 9 t11.setName("t11"); //設置線程名 10 t22.setName("t22"); 11 t11.start(); //啟動線程 12 t22.start(); 13 14 } 15 16 } 17 18 class Number{ 19 public int num=1; //number.num的起始值為1 20 } 21 22 class T11 implements Runnable{ 23 private Number number; 24 T11(Number number){ //通過構造函數引入 Number對象 25 this.number=number; 26 } 27 public void run(){ 28 while(number.num<30){ // 條件 number.num <30 29 synchronized(number){//通過同步語句塊將異步線程變成同步線程執行以下語句,對象為number 30 try{ 31 if(number.num %2!=0){ //打印非2的倍數 32 Thread.sleep(500);//0.5s打印一次 33 System.out.println(Thread.currentThread().getName()+"------>"+number.num); //獲取當前線程名 34 number.num++; //打印后num 自增 35 } 36 if(number.num %2==0){ 37 number.notify(); //喚醒 休眠狀態下的線程T22 38 number.wait(); //線程T11釋放對象鎖,讓線程T22獲取到對象鎖,而線程T11進入休眠狀態 39 } 40 }catch(Exception e){ 41 e.printStackTrace(); //詳細的異常情況 42 } 43 } 44 } 45 } 46 } 47 48 class T22 implements Runnable{ 49 private Number number; 50 T22(Number number){ 51 this.number=number; 52 } 53 public void run(){ 54 while(number.num<30){ 55 synchronized(number){ 56 try{ 57 if(number.num %2==0){ //打印2的倍數 58 Thread.sleep(500); 59 System.out.println(Thread.currentThread().getName()+"------>"+number.num); 60 number.num++; 61 } 62 if(number.num %2!=0){ 63 number.notify(); 64 number.wait(); 65 66 } 67 }catch(Exception e){ 68 e.printStackTrace(); 69 } 70 } 71 } 72 } 73 }
執行結果如下:
