編寫一個程式,開啟3個執行緒,這3個執行緒的ID分別為A、B、C,每個執行緒將自己的ID在螢幕上列印10遍,要求輸出結果必須按ABC的順序顯示;如:ABCABC
阿新 • • 發佈:2019-01-27
package test1; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 編寫一個程式,開啟3個執行緒, * 這3個執行緒的ID分別為A、B、C, * 每個執行緒將自己的ID在螢幕上列印10遍, * 要求輸出結果必須按ABC的順序顯示; * 如:ABCABC….依次遞推 * * 設計:LOCK+condition(可以把A、B、C理解成主執行緒,子執行緒,孫執行緒) * @author Mahone * */ public class Test3 { public static void main(String[] args) { Test3 obj = new Test3(); obj.init(); } private void init() { final Test3Business tb = new Test3Business(); Thread t1 = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { tb.printA(); } } }); t1.setName("A"); Thread t2 = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { tb.printB(); } } }); t2.setName("B"); Thread t3 = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { tb.printC(); } } }); t3.setName("C"); t1.start(); t2.start(); t3.start(); } } class Test3Business { private String flag = "A"; private Lock lock = new ReentrantLock(); private Condition cA = lock.newCondition(); private Condition cB = lock.newCondition(); private Condition cC = lock.newCondition(); public void printA () { try { lock.lock(); if (!flag.equals("A")) { cA.await(); } System.out.println(Thread.currentThread().getName()); Thread.sleep(1000); flag = "B"; cB.signal(); } catch (Exception ex) { ex.printStackTrace(); }finally { lock.unlock(); } } public void printB () { try { lock.lock(); if (!flag.equals("B")) { cB.await(); } System.out.println(Thread.currentThread().getName()); Thread.sleep(1000); flag = "C"; cC.signal(); } catch (Exception ex) { ex.printStackTrace(); }finally { lock.unlock(); } } public void printC () { try { lock.lock(); if (!flag.equals("C")) { cC.await(); } System.out.println(Thread.currentThread().getName()); Thread.sleep(1000); flag = "A"; cA.signal(); } catch (Exception ex) { ex.printStackTrace(); }finally { lock.unlock(); } } }