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 }
执行结果如下:
执行结果