java中传统的线程通信个人见解
来源:互联网 发布:java脚本自动生成代码 编辑:程序博客网 时间:2024/06/10 13:50
有一个使用共同数据的经验:要用到共同数据(包括同步锁)的若干方法,要放到同一个类里。体现了程序的高内聚,也增强了程序的健壮性。
还有一个经验,把同步代码或在和锁放到共同使用的数据上,而不是放在线程内,这样的好处是什么呢:首先是更符合面向对象的思想。其次是这种设计结构非常容易实现线程的同步,并且增加线程访问共同数据的时候不用每次都在线程内增加同步代码。有利于扩展和维护。
首先看一个例子,子线程先循环10次,主线程再循环100次,接着子线程循环10次,主线程再循环100次,如此循环往复50次;
实现代码如下:
public class TraditionalThreadConnection {/** * @param args */public static void main(String[] args) {final Service service = new Service();//子线程new Thread(new Runnable(){@Overridepublic 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中传统的线程通信个人见解
- java线程创建个人见解
- 黑马程序员---Java中传统线程同步通信技术
- 四:java中传统线程同步与通信
- 线程通信---传统的线程通信
- 对于java的个人见解
- java线程同步及通信Demo——传统的线程通信
- 【java并发】传统线程同步通信技术
- java线程的一些见解
- Java中线程的通信
- Java中线程的通信
- Java多线程通信-利用传统的线程通信wait(),notify()方法实现“生产者消费者模式”
- 个人对listview中type的见解
- Java学习方法的一点个人见解-完整版
- Java学习方法的一点个人见解
- Java学习方法的一点个人见解
- Java学习方法的一点个人见解-完整版
- 【博客搬家】博客搬家了,请大家访问我的个人网站 http://www.raychase.net/
- hadoop-*-streaming.jar源码浅析
- Android原理揭秘系列之framework本地方法注册
- 网络类技术规划与相关书籍
- float, small and random
- java中传统的线程通信个人见解
- AIX 6初学day1 (四)
- linux ubuntu mysql编译安装
- 调试技巧
- Jquery选择卡示例代码
- target=_blank不符合标准?
- Debian6 RVM 安装
- ++a += a++
- 只能怪自己2了。。。传说中的ie缓存机制