3个线程分别打印123

Posted rufus-hua

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3个线程分别打印123相关的知识,希望对你有一定的参考价值。


 1 import java.util.concurrent.locks.Condition;
 2 import java.util.concurrent.locks.ReentrantLock;
 3 
 4 public class ThreadTest {
 5 
 6     public static void main(String[] args) {
 7         new Thread(new PrintNumber(1)).start();
 8         new Thread(new PrintNumber(2)).start();
 9         new Thread(new PrintNumber(3)).start();
10     }
11 }
12 
13 class PrintNumber implements Runnable {
14 
15     private static final ReentrantLock LOCK = new ReentrantLock();
16 
17     private static final Condition[] pArray = new Condition[3];
18 
19     private final Integer printNumber;
20 
21     private volatile static Integer incNumber = 1;
22 
23     static {
24         //打印1的条件
25         pArray[0] = LOCK.newCondition();
26         //打印2的条件
27         pArray[1] = LOCK.newCondition();
28         //打印3的条件
29         pArray[2] = LOCK.newCondition();
30     }
31 
32     PrintNumber(Integer pn) {
33         this.printNumber = pn;
34     }
35 
36     void print() {
37         LOCK.lock();
38         try {
39             //否决条件
40             while (!incNumber.equals(printNumber)) {
41                 //挂起不符合条件的线程
42                 Integer temp = printNumber - 1;
43                 pArray[temp].await();
44             }
45             //action
46             System.out.println(incNumber);
47             incNumber++;
48             if (incNumber > 3) {
49                 incNumber = 1;
50             }
51             //通知下个打印的线程 激活
52             Integer temp = incNumber - 1;
53             pArray[temp].signalAll();
54 
55         } catch (Exception ex) {
56             ex.printStackTrace();
57         } finally {
58             LOCK.unlock();
59         }
60     }
61 
62     @Override
63     public void run() {
64         while (true) {
65             print();
66         }
67     }
68 }

 

 

利用 ReentrantLock 的condition 合理的激活 对应的线程  杜绝 提前激活不需要的线程 

以上是关于3个线程分别打印123的主要内容,如果未能解决你的问题,请参考以下文章

JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段

POSIX(Linux多线程)使用信号量三个线程顺序打印十次123

多线程经典问题2——子线程之间交替问题

C代码pthread信号量程序,有3个线程按顺序打印

三个线程轮流打印1-75,一个线程一次打印5个数

由一个多线程共享Integer类变量问题引起的。。。