Java|Rhyme/JUC 线程按序打印ABCABCABC...

JUC 线程按序打印ABCABCABC…

package thread.alternate; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 线程交替打印 * 三个线程依次打印自己线程的名字 * 例如ABCABCABC... * * @author RhymeChiang * @date 2018/02/02 **/ public class ThreadAlternate { /** * 1代表第一个线程 * 2代表第二个线程 * 3代表第三个线程 */ private int threadNo = 1; // 创建一个同步锁 private Lock lock = new ReentrantLock(); // 代表第一个线程的通信 private Condition condition1 = lock.newCondition(); // 代表第二个线程的通信 private Condition condition2 = lock.newCondition(); // 代表第三个线程的通信 private Condition condition3 = lock.newCondition(); /** * 打印A线程的名字 * * @param loopNo */ public void loopA(int loopNo) { lock.lock(); try { // 如果不是第一个线程,则等待 if (threadNo != 1) { condition1.await(); } //如果是第一个线程则打印这个线程的名字 System.out.print(Thread.currentThread().getName()); // 唤醒第二个线程 threadNo = 2; condition2.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } }public void loopB(int loopNo) { lock.lock(); try { // 如果不是第一个线程,则等待 if (threadNo != 2) { condition2.await(); } //如果是第一个线程则打印这个线程的名字 System.out.print(Thread.currentThread().getName()); // 唤醒第二个线程 threadNo = 3; condition3.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } }public void loopC(int loopNo) { lock.lock(); try { // 如果不是第一个线程,则等待 if (threadNo != 3) { condition3.await(); } //如果是第一个线程则打印这个线程的名字 System.out.print(Thread.currentThread().getName()); // 唤醒第二个线程 threadNo = 1; condition1.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } }public static void main(String[] args) {ThreadAlternate alternate = new ThreadAlternate(); new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { alternate.loopA(i); } } },"A").start(); new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { alternate.loopB(i); } } },"B").start(); new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { alternate.loopC(i); } } },"C").start(); } }

【Java|Rhyme/JUC 线程按序打印ABCABCABC...】测试结果:
Java|Rhyme/JUC 线程按序打印ABCABCABC...
文章图片

    推荐阅读