首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java 多线程 打印的统制方法

2013-01-07 
Java 多线程 打印的控制方法我今天要分析的问题很简单,使用三个线程,要求线程1打印“AAA”,然后线程2打印“BB

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();}}

这种写法在效率上不好的一点是即使thx在 id == lock.target的判断中失败,这个thx还是会在while循环中恬不知耻的继续去试图占有锁,而在 lock.target在被其他线程改写之前,thx的这种尝试是必然失败的,所以一个改进就是在 id = lock.target失败后再写一个分支,让thx在对象lock上wait,同时释放锁,让那些可能会在当前状况下打印的线程去占有锁,这个 right thread 通过了 id == lock.target的判断后,执行完操作,就唤醒在lock上wait的线程,因为现在的lock.target已经改变,其他线程可以去竞争这把锁了。
代码如下
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();}}

热点排行