zoukankan      html  css  js  c++  java
  • 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 合理的激活 对应的线程  杜绝 提前激活不需要的线程 

  • 相关阅读:
    LeetCode 70
    LeetCode 81
    LeetCode 33
    LeetCode 78
    LeetCode 50
    LeetCode 34
    关于机器学习的学习笔记
    图的 DFS 与 BFS 复杂度分析
    Sqlalchemy的学习使用和常见问题
    mysql的使用和远程连接
  • 原文地址:https://www.cnblogs.com/rufus-hua/p/8468765.html
Copyright © 2011-2022 走看看