首页 > 代码库 > 一道多线程通信实例分析
一道多线程通信实例分析
程序如下:
public static void main(String[] args) throws Exception{ final List list = new ArrayList(); final Object lock = new Object(); Thread t1 = new Thread(new Runnable() { @Override public void run() { synchronized (lock){ for(int i = 0 ; i < 10 ; i++){ list.add(i); if(list.size() == 5){ lock.notify(); System.out.println(Thread.currentThread().getName() + "发出通知!"); } } } System.out.println(Thread.currentThread().getName() + "execute over!"); } }); Thread t2 = new Thread(new Runnable() { @Override public void run() { synchronized (lock){ if(list.size() != 5){ try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName() + " 收到通知!"); } System.out.println(Thread.currentThread().getName() + "execute over!"); } }); t2.start(); Thread.sleep(1000); t1.start(); }
分析:
程序的意图本是利用多线程之间的通信,利用wait/notify实现,可是运行的结果是虽然线程T1发出了通知,但是线程T2并没有立即收到通知进行执行,这是为什么呢? 因为只有线程T1执行完毕释放了锁,T2才能执行,那么也就是说wait/notify并不是实时的(wait释放了锁,而notify没有释放锁导致的),那么线程之间实时的通信该怎么做呢?可以利用CountDownLatch来实现。
对程序的改进:
public static void main(String[] args) throws Exception{ final List list = new ArrayList(); final Object lock = new Object(); final CountDownLatch countDownLatch = new CountDownLatch(1); Thread t1 = new Thread(new Runnable() { @Override public void run() { for(int i = 0 ; i < 10 ; i++){ list.add(i); if(list.size() == 5){ countDownLatch.countDown(); System.out.println(Thread.currentThread().getName() + "发出通知!"); } } System.out.println(Thread.currentThread().getName() + "execute over!"); } }); Thread t2 = new Thread(new Runnable() { @Override public void run() { if(list.size() != 5){ try { countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " 收到通知!"); } System.out.println(Thread.currentThread().getName() + "execute over!"); } }); t2.start(); Thread.sleep(1000); t1.start(); }
本文出自 “学海无涯 心境无限” 博客,请务必保留此出处http://zhangfengzhe.blog.51cto.com/8855103/1875221
一道多线程通信实例分析
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。