Java 多线程 打印的控制方法
我今天要分析的问题很简单,使用三个线程,要求线程1打印“AAA”,然后线程2打印“BBB”,然后线程3打印“CCC”,重复10次。
使用 java api。用尽量多的方式去实现以上功能。
今天先上第一种吧。完全基于块的synchronized。
package learn;class MyLock{int target = 0;String strprint[] = {"AAA", "BBB", "CCC"}; }class MethodToPrint implements Runnable{private int id, count = 10;private MyLock lock;MethodToPrint(int id, MyLock lock){this.id = id;this.lock = lock;}public void run(){while(count > 0){synchronized(lock){if(id == lock.target){count--;System.out.println(lock.strprint[id]);lock.target = (lock.target +1) % 3;}}}}}class Go{public static void main(String args[]){MyLock lock = new MyLock();Thread th1 = new Thread( new MethodToPrint(0, lock));Thread th2 = new Thread( new MethodToPrint(1, lock));Thread th3 = new Thread( new MethodToPrint(2, lock));th1.start();th2.start();th3.start();}}package learn;class MyLock{int target = 0;String strprint[] = {"AAA", "BBB", "CCC"}; }class MethodToPrint implements Runnable{private int id, count = 10;private MyLock lock;MethodToPrint(int id, MyLock lock){this.id = id;this.lock = lock;}public void run(){while(count > 0){synchronized(lock){if(id == lock.target){count--;System.out.println(lock.strprint[id]);lock.target = (lock.target +1) % 3;lock.notifyAll();}else{try{lock.wait();}catch(InterruptedException e){throw new RuntimeException(e);}}}}}}class Go{public static void main(String args[]){MyLock lock = new MyLock();Thread th1 = new Thread( new MethodToPrint(0, lock));Thread th2 = new Thread( new MethodToPrint(1, lock));Thread th3 = new Thread( new MethodToPrint(2, lock));th1.start();th2.start();th3.start();}}