java多线程通信 例子

 1 package com.cl.www.thread;
 2 
 3 public class NumberHolder {
 4     
 5     private Integer number = 0;
 6     
 7     // 增加number
 8     public synchronized void increaseNum(){
 9         //不是0就不加
10         while(number != 0){   
11             try {
12                 this.wait();
13             } catch (InterruptedException e) {
14                 e.printStackTrace();
15             }
16         }
17         number++;
18         System.out.println("number的值为:"+number);
19         this.notifyAll(); //通知其它线程
20     }
21     
22     //减少number
23     public synchronized void decreaseNum(){
24         //如果等于0就不减少
25         while(number == 0){
26             try {
27                 this.wait();
28             } catch (InterruptedException e) {
29                 e.printStackTrace();
30             }
31         }
32         number--;
33         System.out.println("number的值为:"+number);
34         this.notifyAll(); //通知其它线程
35     }
36 }
 1 package com.cl.www.thread;
 2 /**
 3  * 
 4  * 增加number
 5  */
 6 public class IncreaseThread implements Runnable{
 7     
 8     private NumberHolder numberHolder;
 9     
10     public IncreaseThread(NumberHolder numberHolder) {
11         this.numberHolder = numberHolder;
12     }
13 
14     @Override
15     public void run() {
16         int i = 0;
17         while(i<10){
18             try {
19                 Thread.sleep(1000);
20             } catch (InterruptedException e) {
21                 e.printStackTrace();
22             }
23             numberHolder.increaseNum();
24             i++;
25         }
26     }
27 }
 1 package com.cl.www.thread;
 2 
 3 /**
 4  * 减少number
 5  *
 6  */
 7 public class DecreaseThread implements Runnable{
 8     
 9     private NumberHolder numberHolder;
10     
11     public DecreaseThread(NumberHolder numberHolder) {
12         
13         this.numberHolder = numberHolder;
14     }
15     @Override
16     public void run() {
17         int i =0;
18         while(i<10){
19             try {
20                 Thread.sleep((long)Math.random()*1000);
21             } catch (InterruptedException e) {
22                 e.printStackTrace();
23             }
24             numberHolder.decreaseNum();
25             i++;
26         }
27     }
28 }
 1 package com.cl.www.thread;
 2 
 3 public class MainTest {
 4     public static void main(String[] args) {
 5         
 6         NumberHolder numberHolder = new NumberHolder();
 7         
 8         IncreaseThread increaseThread = new IncreaseThread(numberHolder);
 9         DecreaseThread decreaseThread = new DecreaseThread(numberHolder);
10         
11         Thread th1 = new Thread(increaseThread);   // 加 number
12         Thread th2 = new Thread(decreaseThread);   // 减 number
13         
14         Thread th3 = new Thread(increaseThread);    // 加 number
15         Thread th4 = new Thread(decreaseThread);    // 减 number
16         
17         th1.start();
18         th2.start();
19         
20         th3.start();
21         th4.start();
22     }
23 }

输出结果

原文地址:https://www.cnblogs.com/c9999/p/6249702.html