java:lock中使用多个condition实现通知特定线程

来源:互联网 发布:江苏域名备案查询 编辑:程序博客网 时间:2024/05/21 14:08

相对于synchronized块中使用notify或者notifyall,通知的线程都是不确定的,当发一个通知,并不知道

下一个竞争到所得会是哪个线程。

而lock更加细腻,通过多个condition,则可以实现通知部分线程的功能。

service类:

package service;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class MyService {private Lock lock = new ReentrantLock();public Condition conditionA = lock.newCondition();  //两个conditionpublic Condition conditionB = lock.newCondition();public void awaitA() {try {lock.lock();System.out.println("begin awaitA时间为" + System.currentTimeMillis()+ " ThreadName=" + Thread.currentThread().getName());conditionA.await();  //用conditiona等待。System.out.println("  end awaitA时间为" + System.currentTimeMillis()+ " ThreadName=" + Thread.currentThread().getName());} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}public void awaitB() {try {lock.lock();System.out.println("begin awaitB时间为" + System.currentTimeMillis()+ " ThreadName=" + Thread.currentThread().getName());conditionB.await();System.out.println("  end awaitB时间为" + System.currentTimeMillis()+ " ThreadName=" + Thread.currentThread().getName());} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}public void signalAll_A() {try {lock.lock();System.out.println("  signalAll_A时间为" + System.currentTimeMillis()+ " ThreadName=" + Thread.currentThread().getName());conditionA.signalAll();   //用a来打开。} finally {lock.unlock();}}public void signalAll_B() {try {lock.lock();System.out.println("  signalAll_B时间为" + System.currentTimeMillis()+ " ThreadName=" + Thread.currentThread().getName());conditionB.signalAll();} finally {lock.unlock();}}}

两个线程包装类:

package extthread;import service.MyService;public class ThreadA extends Thread {private MyService service;public ThreadA(MyService service) {super();this.service = service;}@Overridepublic void run() {service.awaitA();}}

package extthread;import service.MyService;public class ThreadB extends Thread {private MyService service;public ThreadB(MyService service) {super();this.service = service;}@Overridepublic void run() {service.awaitB();}}

运行类:

package test;import service.MyService;import extthread.ThreadA;import extthread.ThreadB;public class Run {public static void main(String[] args) throws InterruptedException {MyService service = new MyService();ThreadA a = new ThreadA(service);a.setName("A");a.start();ThreadB b = new ThreadB(service);b.setName("B");b.start();Thread.sleep(3000);service.signalAll_A();}}


当是conditionA等待时,conditionB的signal方法时无法唤醒的。



0 0
原创粉丝点击