本例,开启一个公告线程处理flag变量,再开启三个线程抢夺flag变量处理。结果可以看出,三个线程分别排队等待获取flag的获取权。
package test;
public class Test1 {
private String flag[] = {"true"};
// private String flag = "true;
class NotifyThread extends Thread {
public NotifyThread(String name){
super(name);
}
public void run(){
try{
System.out.println(getName() + " >> sleep(3000)" );
sleep(3000);
}catch(InterruptedException e){
e.printStackTrace();
}
synchronized(flag){
System.out.println(getName() + " >> flag[0] = false1" );
flag[0] = "false";
System.out.println(getName() + " >> flag[0] = false" );
// flag.notifyAll();
flag.notify();
}
}
};
class WaitThread extends Thread{
public WaitThread(String name){
super(name);
}
public void run(){
synchronized(flag){
System.out.println(getName() + " >> "+ flag[0]);
while(flag[0] != "false") {
System.out.println(getName() + " >> begin waiting!");
long waitTime = System.currentTimeMillis();
try{
flag.wait();
System.out.println(getName() + " >> 结束 wait()" );
flag.notify();
sleep(3000);
}catch(InterruptedException e){
e.printStackTrace();
}
waitTime = System.currentTimeMillis() - waitTime;
System.out.println(getName() + " >> wait time : " + waitTime);
}
System.out.println(getName() + " >> flag[0] = false");
}
System.out.println(getName() + " >> synchronized(flag)");
}
};
public static void main(String[] args) throws InterruptedException{
System.out.println("Main Thread Run !");
Test1 ttt = new Test1();
NotifyThread nt = ttt.new NotifyThread("notify001");
WaitThread wt001 = ttt.new WaitThread("waiter001");
WaitThread wt002 = ttt.new WaitThread("waiter002");
WaitThread wt003 = ttt.new WaitThread("waiter003");
nt.start();
wt001.start();
wt002.start();
wt003.start();
}
}
运行结果:
Main Thread Run !
notify001 >> sleep(3000)
waiter001 >> true
waiter001 >> begin waiting!
waiter003 >> true
waiter003 >> begin waiting!
waiter002 >> true
waiter002 >> begin waiting!
notify001 >> flag[0] = false1
notify001 >> flag[0] = false
waiter001 >> 结束 wait()
waiter001 >> wait time : 6022
waiter001 >> flag[0] = false
waiter001 >> synchronized(flag)
waiter003 >> 结束 wait()
waiter003 >> wait time : 9034
waiter003 >> flag[0] = false
waiter003 >> synchronized(flag)
waiter002 >> 结束 wait()
waiter002 >> wait time : 12046
waiter002 >> flag[0] = false
waiter002 >> synchronized(flag)