您的位置:首页 > 编程语言 > Java开发

【JAVA】多线程之synchronized 同步数据 方法

2016-07-20 16:56 381 查看
本例,开启一个公告线程处理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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 多线程