java中传统的线程通信个人见解


有一个使用共同数据的经验:要用到共同数据(包括同步锁)的若干方法,要放到同一个类里。体现了程序的高内聚,也增强了程序的健壮性。

还有一个经验,把同步代码或在和锁放到共同使用的数据上,而不是放在线程内,这样的好处是什么呢:首先是更符合面向对象的思想。其次是这种设计结构非常容易实现线程的同步,并且增加线程访问共同数据的时候不用每次都在线程内增加同步代码。有利于扩展和维护。

首先看一个例子,子线程先循环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(){ @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就可以避免伪唤醒带来的灾难,还可以判断一下是否可以去执行代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值