【3个线程顺序打印ABC】package com.imooc.bigdata.hbase.api;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class PintABC {
private static volatile int state = 0;
public static void main(String[] args) {
ExecutorService es = Executors.newFixedThreadPool(3);
ReentrantLock lock = new ReentrantLock();
Condition conditonA = lock.newCondition();
Condition conditonB = lock.newCondition();
Condition conditonC = lock.newCondition();
Worker workerA = new Worker(lock, conditonA, conditonB, 10, 0, “A”);
Worker workerB = new Worker(lock, conditonB, conditonC, 10, 1, “B”);
Worker workerC = new Worker(lock, conditonC, conditonA, 10, 2, “C”);
es.execute(workerA);
es.execute(workerB);
es.execute(workerC);
es.shutdown();
}public static class Worker implements Runnable {
private ReentrantLock lock;
private Condition cur;
private Condition next;
private Integer count;
private Integer tagetPrint;
private String key;
public Worker(ReentrantLock lock, Condition cur, Condition next, Integer count, Integer tagetPrint, String key) {
this.lock = lock;
this.cur = cur;
this.next = next;
this.count = count;
this.tagetPrint = tagetPrint;
this.key = key;
}@Override
public void run() {
lock.lock();
try {
for (int i = 0;
i < count;
i++) {
while (state % 3 != tagetPrint) {//不需要打对应key,进入等待
cur.await();
}
System.out.println(i + "," + key);
state++;
next.signal();
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
}