編寫一個程式,啟動三個執行緒,三個執行緒的名稱分別是 A,B,C; 每個執行緒將自己的名稱在螢幕上列印5遍,列印順序是ABCABC...
阿新 • • 發佈:2018-11-20
- 設定標誌位flag
- 當flag==1時,列印A
- 當flag==2時,列印B
- 當flag==3時,列印C
- 用count控制列印的次數,題目要求列印5遍,即15個字元
- 這裡的用notifyAll()的原因:是要把其餘兩個全都喚醒,因為如果用notify(),它是二選一喚醒,不確定它是否會喚醒我們所需要的
- run()方法裡的程式碼是判斷確定列印某個字元,即:當與執行緒名稱一樣時,則列印
class Print { private int flag = 1; private int count = 0; public int getCount() { return count; } public synchronized void printA() { while (flag != 1) { //不為1,所以列印A的執行緒等待 try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.print(Thread.currentThread().getName()); count++; flag = 2; notifyAll(); } public synchronized void printB() { while (flag != 2) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.print(Thread.currentThread().getName()); flag = 3; count++; notifyAll(); } public synchronized void printC() { while (flag != 3) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.print(Thread.currentThread().getName()); flag = 1; count++; notifyAll(); } } class MyThread implements Runnable { private Print print; public MyThread(Print print) { this.print = print; } @Override public void run() { while (print.getCount() < 16) { if (Thread.currentThread().getName().equals("A")) { print.printA(); } else if (Thread.currentThread().getName().equals("B")) { print.printB(); } else if (Thread.currentThread().getName().equals("C")) { print.printC(); } } } } public class Test { public static void main(String[] args) { Print print = new Print(); MyThread myThread = new MyThread(print); Thread thread1 = new Thread(myThread,"A"); Thread thread2 = new Thread(myThread,"B"); Thread thread3 = new Thread(myThread,"C"); thread1.start(); thread2.start(); thread3.start(); } }