线程同步 wait 和 notify 使用例子
2015-10-09 17:19
417 查看
如果需要统计区间[0, 1000]范围内偶数的个数,可以使用如下代码:
运行之后发现结果总是 0,这是由于线程启动 t 启动之后,run 方法还没执行之前,主线程就已经执行完成了;为了解决这个问题,可以在 t.start() 之后添加 sleep 来解决这个问题。
虽然通过 sleep 可以解决这个问题,但是解决方案不够灵活和优雅,更好的方法是通过线程之间的同步机制来彻底解决,可以在 t.start() 之后添加如下代码:
这段代码的作用在于,在 t.start() 调用 notify() 之前,主线程一直处于 wait 的状态。
猜测应该是 t.start() 里面调用了 notify() 方法,为了验证,可以在 synchroized 上面加上 sleep(), 这样一来,t.start() 执行完成并且 notify() 方法已经调用完成之后,t.wait() 还没有被执行,等执行到 t.wait() 的时候,程序就会死等在这里,因为已经没有 notify() 调用了。
public class Test { private static int counter = 0; private static class CountRunnable implements Runnable { public void run() { for (int i = 0; i < 10; ++i) { if (i % 2 == 0) { counter += 1; } } } } public static void main(String []args) throws InterruptedException { Runnable r = new CountRunnable(); Thread t = new Thread(r); t.start(); System.out.println("counter=" + counter); } }
运行之后发现结果总是 0,这是由于线程启动 t 启动之后,run 方法还没执行之前,主线程就已经执行完成了;为了解决这个问题,可以在 t.start() 之后添加 sleep 来解决这个问题。
虽然通过 sleep 可以解决这个问题,但是解决方案不够灵活和优雅,更好的方法是通过线程之间的同步机制来彻底解决,可以在 t.start() 之后添加如下代码:
synchronized (t) { t.wait(); }
这段代码的作用在于,在 t.start() 调用 notify() 之前,主线程一直处于 wait 的状态。
猜测应该是 t.start() 里面调用了 notify() 方法,为了验证,可以在 synchroized 上面加上 sleep(), 这样一来,t.start() 执行完成并且 notify() 方法已经调用完成之后,t.wait() 还没有被执行,等执行到 t.wait() 的时候,程序就会死等在这里,因为已经没有 notify() 调用了。
相关文章推荐
- WaveoutGetSelectControl(0 failed
- 面向初学者之烦人的mainactivity启动前的actionBAR
- git unpack failed: error Missing commit错误
- grail安装和创建一个简单的例子
- 利用ssh和tail实时监控应用日志
- ubuntu 上OError: decoder jpeg not available问题解决
- Warning: NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
- win7下iis报503 Service Unavailable错误的解决方法
- HDU 5326 Work(并查集)(2015 Multi-University Training Contest 3)
- Repairing
- hdu 4251 The Famous ICPC Team Again划分树入门题
- __lll_mutex_lock_wait的错误原因
- hdu 5046 Airport (重复覆盖)
- sendmail邮件服务器
- Epic Fail of a Genie
- 等待执行:time.sleep()和implicitly_wait()
- Scala学习笔记12【继承、抽象类、trait实战】
- 游戏中AI的行为树(Behaviour Tree in Game AI)
- maven编译时出现 There are test failures
- 【CF】323 Div2. D. Once Again...