@frank-shaw
2015-10-29T02:55:30.000000Z
字数 1433
阅读 2827
java.多线程
package test1;/** 该程序功能是实现线程ABC依次输出各自名称N次** 思路:(借鉴网络,自己没有找到解决方案)* 这里使用三把锁 A B C* 线程A 的执行依赖与锁A B 相关的内容* 线程B 的执行依赖与锁B C 相关的内容* 线程C 的执行依赖与锁C A 相关的内容** 同时设置一计数器,每个线程执行一定次数停止** *************************************************** 考察了对wait() notify() notifyAll()的理解:** Obj.wait(),与Obj.notify()必须要与synchronized(Obj)* 一起使用,也就是wait,与notify是针对已经获取了Obj锁进* 行操作,从语法角度来说就是Obj.wait(),Obj.notify必须在* synchronized(Obj){...}语句块内。** wait():线程在获取对象锁后,主动释放对象锁,同时本线程休眠。* 直到有其它线程调用对象的notify()唤醒该线程,才能继续获取对* 象锁,并继续执行。** notify():释放对象锁,并且唤醒正在等待该对象锁的某一个线程。* 需要注意的是,执行完notify()之后并不是立即释放对象锁,而是* 执行完synchronized(Obj){...}语句块之后释放。** notifyAll()与notify()类似,只不过唤醒的是所有正在等待该对* 象锁的线程,让他们竞争去吧~**/public class ABCInorder {//三把锁static Object A = new Object();static Object B = new Object();static Object C = new Object();public static void main(String[] args) {Thread t1 = new Thread(new Source(A,B,3),"A");Thread t2 = new Thread(new Source(B,C,4),"B");Thread t3 = new Thread(new Source(C,A,3),"C");t1.start();t2.start();t3.start();}}class Source implements Runnable{//lock in the sourceObject inside;Object outside;//看来我想错了,这里的count并不是共有资源int count;public Source(Object in, Object out,int num){this.inside = in;this.outside = out;this.count = num;}@Overridepublic void run() {while(true){if(count>0){synchronized(outside){synchronized(inside){count--;System.out.print(Thread.currentThread().getName());//释放inside锁,唤醒其他正在等待该锁的线程inside.notifyAll();}try{//释放outside这个锁,并且等待别人唤醒outside.wait();}catch(Exception e){e.printStackTrace();}}}else return ;}}}
