两个线程,循环输出1~100

来源:互联网 发布:c语言间隔输出 编辑:程序博客网 时间:2024/05/21 01:45
  1. public class Test {  
  2.     //state==1表示线程1开始打印,state==2表示线程2开始打印  
  3.     private static int state = 1;  
  4.       
  5.     private static int num1 = 1;  
  6.     private static int num2 = 2;  
  7.       
  8.     public static void main(String[] args) {  
  9.         final Test t = new Test();  
  10.         new Thread(new Runnable() {  
  11.             @Override  
  12.             public void run() {  
  13.                 while(num1<100){  
  14.                     //两个线程都用t对象作为锁,保证每个交替期间只有一个线程在打印  
  15.                     synchronized (t) {  
  16.                         // 如果state!=1, 说明此时尚未轮到线程1打印, 线程1将调用t的wait()方法, 直到下次被唤醒  
  17.                         if(state!=1){  
  18.                             try {  
  19.                                 t.wait();  
  20.                             } catch (InterruptedException e) {  
  21.                                 e.printStackTrace();  
  22.                             }  
  23.                         }  
  24.                          // 当state=1时, 轮到线程1打印5次数字  
  25.                         for(int j=0; j<5; j++){  
  26.                             System.out.println(num1);  
  27.                             num1 += 2;  
  28.                         }  
  29.                         // 线程1打印完成后, 将state赋值为2, 表示接下来将轮到线程2打印  
  30.                         state = 2;  
  31.                         // notifyAll()方法唤醒在t上wait的线程2, 同时线程1将退出同步代码块, 释放t锁  
  32.                         t.notifyAll();  
  33.                     }  
  34.                 }  
  35.             }  
  36.         }).start();  
  37.           
  38.         new Thread(new Runnable() {  
  39.             @Override  
  40.             public void run() {  
  41.                 while(num2<100){  
  42.                     synchronized (t) {  
  43.                         if(state!=2){  
  44.                             try {  
  45.                                 t.wait();  
  46.                             } catch (InterruptedException e) {  
  47.                                 e.printStackTrace();  
  48.                             }  
  49.                         }  
  50.                         for(int j=0; j<5; j++){  
  51.                             System.out.println(num2);  
  52.                             num2 += 2;  
  53.                         }  
  54.                         state = 1;  
  55.                         t.notifyAll();  
  56.                     }  
  57.                 }  
  58.             }  
  59.         }).start();  
  60.     }  
  61.   
  62. }  
0 0
原创粉丝点击