Condition实现多线程顺序打印

Condition实现多线程顺序打印:

  

 1 import java.util.concurrent.locks.Condition;
 2 import java.util.concurrent.locks.ReentrantLock;
 3
 4 public class Run {
 5
 6     volatile public static int nextPrintWho = 1;
 7     private static ReentrantLock lock = new ReentrantLock();
 8     final private static Condition conditionA = lock.newCondition();
 9     final private static Condition conditionB = lock.newCondition();
10     final private static Condition conditionC = lock.newCondition();
11
12     public static void main(String[] args) {
13
14         Thread threadA = new Thread() {
15             @Override
16             public void run() {
17                 try {
18                     lock.lock();
19                     while (nextPrintWho != 1) {
20                         conditionA.await();
21                     }
22                     for (int i = 0; i < 3; i++) {
23                         System.out.println("ThreadA " + (i+1));
24                     }
25                     nextPrintWho = 2;
26                     conditionB.signalAll();
27                 } catch (InterruptedException e) {
28                     e.printStackTrace();
29                 }finally {
30                     lock.unlock();
31                 }
32             };
33         };
34         Thread threadB = new Thread() {
35             @Override
36             public void run() {
37                 try {
38                     lock.lock();
39                     while (nextPrintWho != 2) {
40                         conditionB.await();
41                     }
42                     for (int i = 0; i < 3; i++) {
43                         System.out.println("ThreadB " + (i+1));
44                     }
45                     nextPrintWho = 3;
46                     conditionC.signalAll();
47                 } catch (InterruptedException e) {
48                     e.printStackTrace();
49                 }finally {
50                     lock.unlock();
51                 }
52             };
53         };
54         Thread threadC = new Thread() {
55             @Override
56             public void run() {
57                 try {
58                     lock.lock();
59                     while (nextPrintWho != 3) {
60                         conditionC.await();
61                     }
62                     for (int i = 0; i < 3; i++) {
63                         System.out.println("ThreadC " + (i+1));
64                     }
65                     nextPrintWho = 1;
66                     conditionA.signalAll();
67                 } catch (InterruptedException e) {
68                     e.printStackTrace();
69                 }finally {
70                     lock.unlock();
71                 }
72             };
73         };
74         Thread[] aArray = new Thread[5];
75         Thread[] bArray = new Thread[5];
76         Thread[] cArray = new Thread[5];
77         for (int i = 0; i < 5; i++) {
78             aArray[i] = new Thread(threadA);
79             bArray[i] = new Thread(threadB);
80             cArray[i] = new Thread(threadC);
81             aArray[i].start();
82             bArray[i].start();
83             cArray[i].start();
84         }
85     }
86 }

运行结果如下:

  

原文地址:https://www.cnblogs.com/wang1001/p/9579889.html

时间: 2024-10-07 22:34:57

Condition实现多线程顺序打印的相关文章

多线程顺序打印

前言: 下面的代码是参考网址:http://love3400wind.blog.163.com/blog/static/796308012013117102941831/ , http://blog.csdn.net/liu251/article/details/6227763 做了一点点的改动. 感谢两位作者! 题目: 有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C 要求, 同时启动三个线程, 按顺序输出ABC, 循环10次 package org.wit.ff.thre

JAVA 多线程开篇 -从按顺序打印ABC开始

序言 很想把一个问题弄清楚,特别是以前一直模模糊糊的并发编程,今天在华为OJ上碰到一道题,“顺序打印ABC的两种方法开始写起”,就以这道题开篇,希望日后有时间把并发编程的基本问题弄清楚. 问题 启动三个线程,一个线程打印A,一个打印B,一个打印C,按顺序打印ABC.....如输入3,输出就是“ABCABCABC” 程序 线程的调度是由系统操作的,要想多个线程按照要求顺序打印,就必须做好线程间的同步. 思路:四个线程循环打印,但是一个线程打印一个字母释放锁后无法确定获得锁的是哪一个线程,这就需要用

多线程练习--顺序打印ABC十次

这是迅雷的一道面试题,顺序打印ABC十次. public class TenABC { public static void main(String[] args) { final BlockingQueue queue = new ArrayBlockingQueue(30); for (int i = 0; i < 10; i++) { try { queue.put("A"); queue.put("B"); queue.put("C"

Java多线程循环打印ABC的5种实现方法

题目:3个线程循环打印ABC,其中A打印3次,B打印2次,C打印1次,循环打印2轮一.Synchronized同步法思路:使用synchronized.wait.notifyAll的方法利用线程标记变量控制三个线程的执行顺序. /** * @author XDarker * 2018-5-17 */public class Main { public static void main(String[] args) throws InterruptedException { int num = 1

Java多个线程顺序打印数字

要求 启动N个线程, 这N个线程要不间断按顺序打印数字1-N. 将问题简化为3个线程无限循环打印1到3 方法一: 使用synchronized 三个线程无序竞争同步锁, 如果遇上的是自己的数字, 就打印. 这种方式会浪费大量的循环 public class TestSequential1 { private volatile int pos = 1; private volatile int count = 0; public void one(int i) { synchronized (th

按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: vector<vect

按之字形顺序打印二叉树-剑指Offer

按之字形顺序打印二叉树 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 思路 根据题意,每行的节点的访问顺序是相反的,我们可以用两个栈来隔行存储,一个栈中根据“左结点->右结点”的顺序访问另一个栈的栈顶元素,而另一个栈根据“右子树->左子树”的顺序访问另一个栈的栈顶元素,直到两个栈都为空 代码 import java.util.ArrayList; import java.util.St

剑指offer(五十三)之按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 代码: <span style="color:#000099;">import java.util.ArrayList; import java.util.*; /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = n

多线程顺序的控制(wait,notity,sleep)

public class abc extends Thread{    private Object prev=null;    private Object self=null;    private String msg=null;    public abc(Object prev,Object self,String msg){        this.prev=prev;        this.self=self;        this.msg=msg;    }    publi