3个线程顺序打印ABC

【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(); } } }

}

    推荐阅读