java中传统的线程通信个人见解
2014-04-11 15:42
351 查看
java中传统的线程通信个人见解
分类: java2011-09-1818:41 743人阅读 评论(3) 收藏 举报
javaserviceclassthreadstring扩展
有一个使用共同数据的经验:要用到共同数据(包括同步锁)的若干方法,要放到同一个类里。体现了程序的高内聚,也增强了程序的健壮性。
还有一个经验,把同步代码或在和锁放到共同使用的数据上,而不是放在线程内,这样的好处是什么呢:首先是更符合面向对象的思想。其次是这种设计结构非常容易实现线程的同步,并且增加线程访问共同数据的时候不用每次都在线程内增加同步代码。有利于扩展和维护。
首先看一个例子,子线程先循环10次,主线程再循环100次,接着子线程循环10次,主线程再循环100次,如此循环往复50次;
实现代码如下:
[java] view
plaincopy
public class TraditionalThreadConnection {
/**
* @param args
*/
public static void main(String[] args) {
final Service service = new Service();
//子线程
new Thread(new Runnable(){
@Override
public void run() {
for(int i = 1;i<=50;i++){
service.subThread(i);
}
}
}).start();
//主线程
for(int i = 1;i<=50;i++){
service.mainThread(i);
}
}
}
class Service{
/* 是否该子线程运行的标志 */
private boolean isSub = true;
public synchronized void subThread(int loop){
//首先是判断是否该子线程运行,不是就等待
while(!isSub){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=1;i<=10;i++){
System.out.println("sub-thread-" + i + ",loop--" + loop);
}
isSub = false;
//子线程运行完之后叫醒主线程
this.notify();
}
public synchronized void mainThread(int loop){
while(isSub){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=1;i<=100;i++){
System.out.println("main-thread-" + i + ",loop--" + loop);
}
isSub = true;
this.notify();
}
}
还有一点要注意的地方,就在判断是否等待的地方为什么用到while而不是if:原因是这样的,因为使用wait的时候有可能在没有调用notify的时候自己就唤醒了,开始去执行代码了,这叫做假唤醒。使用while就可以避免伪唤醒带来的灾难,还可以判断一下是否可以去执行代码。
相关文章推荐
- java中传统的线程通信个人见解
- Java多线程与并发应用-(4)-传统线程通信技术试题
- Java多线程与并发应用-(3)-传统线程通信技术及生产者消费者模式
- java线程创建个人见解
- Java多线程通信-利用传统的线程通信wait(),notify()方法实现“生产者消费者模式”
- Java线程(一):传统线程的实现、互斥与通信
- java线程同步及通信Demo——传统的线程通信
- Java学习个人备忘录之线程间的通信
- Java学习个人备忘录之线程间的通信
- 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题
- [原]Java多线程编程学习笔记之十:线程间通信中notify通知的遗漏(含代码)
- java线程通信--生产者消费者问题
- Java线程同步和线程间通信代码和控制线程关闭
- java多线程之线程间通信:等待/通知机制
- JAVA学习笔记(5)_____String对象比较的一些个人见解
- 彻底明白Java的多线程-线程间的通信
- Java多线程基础(四)Java传统线程同步通信技术
- 线程通信Java
- Java里如何实现线程间通信?
- 在Java中,关于线程的通信