condition实现通知部分线程

多个condition实现通知部分线程:

 1 import java.util.concurrent.locks.Condition;
 2 import java.util.concurrent.locks.Lock;
 3 import java.util.concurrent.locks.ReentrantLock;
 4 
 5 public class MyService {
 6     private Lock lock = new ReentrantLock();
 7     //获取两个Condition
 8     private Condition conditionA = lock.newCondition();
 9     private Condition conditionB = lock.newCondition();
10     
11     public void awaitA() {
12         try {
13             lock.lock();
14             System.out.println("begin awaitA时间:" + System.currentTimeMillis() + "----" + Thread.currentThread().getName());
15             conditionA.await();
16             System.out.println("end awaitA时间:" + System.currentTimeMillis() + "----" + Thread.currentThread().getName());
17         } catch (InterruptedException e) {
18             e.printStackTrace();
19         }finally {
20             lock.unlock();
21         }
22     }
23     
24     public void awaitB() {
25         try {
26             lock.lock();
27             System.out.println("begin awaitB时间:" + System.currentTimeMillis() + "----" + Thread.currentThread().getName());
28             conditionB.await();
29             System.out.println("end awaitB时间:" + System.currentTimeMillis() + "----" + Thread.currentThread().getName());
30         } catch (InterruptedException e) {
31             e.printStackTrace();
32         }finally {
33             lock.unlock();
34         }
35     }
36     
37     public void signalAll_A() {
38         try {
39             lock.lock();
40             System.out.println("signalAll_A时间为:" + System.currentTimeMillis() + "----" + Thread.currentThread().getName());
41             conditionA.signalAll();
42         } catch (Exception e) {
43             e.printStackTrace();
44         }finally {
45             lock.unlock();
46         }
47     }
48     
49     public void signalAll_B() {
50         try {
51             lock.lock();
52             System.out.println("signalAll_B时间为:" + System.currentTimeMillis() + "----" + Thread.currentThread().getName());
53             conditionB.signalAll();
54         } catch (Exception e) {
55             e.printStackTrace();
56         }finally {
57             lock.unlock();
58         }
59     }
60 }
 1 public class ThreadA extends Thread{
 2 
 3     private MyService service;
 4 
 5     public ThreadA(MyService service) {
 6         this.service = service;
 7     }
 8     
 9     @Override
10     public void run() {
11         service.awaitA();
12     }
13 }
 1 public class ThreadB extends Thread{
 2 
 3     private MyService service;
 4     
 5     public ThreadB(MyService service) {
 6         this.service = service;
 7     }
 8     
 9     @Override
10     public void run() {
11         service.awaitB();
12     }
13 }
 1 /**
 2  *    测试类
 3  */
 4 public class Run {
 5 
 6     public static void main(String[] args) {
 7         MyService service = new MyService();
 8         ThreadA a = new ThreadA(service);
 9         a.setName("A");
10         a.start();
11         
12         ThreadB b = new ThreadB(service);
13         b.setName("B");
14         b.start();
15         try {
16             Thread.sleep(3000);
17         } catch (InterruptedException e) {
18             e.printStackTrace();
19         }
20         //只唤醒A
21         service.signalAll_A();
22     }
23 }

运行结果如下:

  

原文地址:https://www.cnblogs.com/wang1001/p/9566741.html