condition

多线程之间按照顺序调用,实现A->B->C,
三个线程启动,要求如下,
A打印5次,B打印10次,C打印15次,
反复重复10轮。
import java.util.concurrent.locks.*;

class ShareResource {

	private int number=1;
	private Lock lock=new ReentrantLock();
	private Condition condition1=lock.newCondition();
	private Condition condition2=lock.newCondition();
	private Condition condition3=lock.newCondition();

	public void println5() {
		lock.lock();
		try {
			while(number!=1) {
				condition1.await();

			}
			for (int i=1; i<=5; i++) {
				System.out.println(Thread.currentThread().getName()+"\t"+i);
			}
			number=2;
			condition2.signal();
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			lock.unlock();
		}
	}

	public void println10() {
		lock.lock();
		try {
			while(number!=2) {
				condition2.await();

			}
			for (int i=1; i<=10; i++) {
				System.out.println(Thread.currentThread().getName()+"\t"+i);
			}
			number=3;
			condition3.signal();
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			lock.unlock();
		}
	}

	public void println15() {
		lock.lock();
		try {
			while(number!=3) {
				condition3.await();

			}
			for (int i=1; i<=15; i++) {
				System.out.println(Thread.currentThread().getName()+"\t"+i);
			}
			number=1;
			condition1.signal();
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			lock.unlock();
		}
	}
}

public class ThreadOrderAccess {
	public static void main(String[] args) {
		ShareResource sr=new ShareResource();

		new Thread(() -> {
			for (int i=0; i<10; i++) {
				sr.println5();
			}
		},"A").start();

		new Thread(() -> {
			for (int i=0; i<10; i++) {
				sr.println10();
			}
		},"B").start();

		new Thread(() -> {
			for (int i=0; i<10; i++) {
				sr.println15();
			}
		},"C").start();	
	}
}
Condition 是一种更细粒度的并发解决方案。
就拿生产者消费者模式来说,当仓库满了的时候,又再执行到 生产者 线程的时候,会把 该 生产者 线程进行阻塞,再唤起一个线程,
但是此时唤醒的是消费者线程还是生产者线程,是未知的。
如果再次唤醒的还是生产者线程,那么还需要把它进行阻塞,再唤起一个线程,再此循环,直到唤起的是消费者线程。
这样就可能存在 时间或者资源上的浪费,所以说 有了Condition 这个东西。
Condition 用 await() 代替了 Object 的 wait() 方法,用 signal() 方法代替 notify() 方法。
注意:Condition 是被绑定到 Lock 中,要创建一个 Lock 的 Condition 必须用 newCondition() 方法。
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务