@frank-shaw
2015-10-29T10:55:30.000000Z
字数 1433
阅读 2569
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 source
Object inside;
Object outside;
//看来我想错了,这里的count并不是共有资源
int count;
public Source(Object in, Object out,int num){
this.inside = in;
this.outside = out;
this.count = num;
}
@Override
public 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 ;
}
}
}