【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)
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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- Python3写爬虫(四)多线程实现数据爬取
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序