一直搞不懂Java线程通信,这次终于明白了( 八 )

此四种方法都可以实现同样的效果,当然你也可以使用Object的wait() 和 notify()/notifyAll()实现
高频面试题——Thread.join()和CountDownLatch的区别

  • Thread.join()是Thread类的一个方法,Thread.join()的实现是依靠Object的wait()和notifyAll()来完成的,而CountDownLatch是JUC包中的一个工具类
当我们使用ExecutorService 【线程池】,就不能使用join,必须使用CountDownLatch,比如:
ExecutorService service = Executors.newFixedThreadPool(5);final CountDownLatch latch = new CountDownLatch(5);for(int x = 0; x < 5; x++) {service.submit(new Runnable() {public void run() {// do somethinglatch.countDown();}});}latch.await();
  • 调用join方法需要等待thread执行完毕才能继续向下执行,而CountDownLatch只需要检查计数器的值为零就可以继续向下执行,相比之下,CountDownLatch更加灵活一些,可以实现一些更加复杂的业务场景 。
为什么wait, notify和notifyAll这些方法在Object类中不在Thread类里面?Java提供的锁是对象级的而不是线程级的,线程为了进入临界区【也就是同步块内】,需要获得锁并等待锁可用,它们并不知道也不需要知道哪些线程持有锁,它们只需要知道当前资源是否被占用,是否可以获得锁,所以锁的持有状态应该由同步监视器来获取,而不是线程本身 。
如果Java不提供关键字来解决线程之间的通信,锁是对象级别,由于wait,notify,notifyAll都是锁级别的操作,每个对象都可以当做锁所以把他们定义在Object类中是最合适的 。?

【一直搞不懂Java线程通信,这次终于明白了】


推荐阅读