1. 程式人生 > >3個線程分別打印123

3個線程分別打印123

pan color override thread system util style err isp




 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