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() 方法。
