多线程通信面试题

Java多线程中调用wait() 和 sleep()方法有什么不同?

  • wait()方法用于线程间通信,如果等待条件为真且其它线程被唤醒时它会释放锁

  • sleep()方法仅仅释放CPU资源或者让当前线程停止执行一段时间,但不会释放锁

如何在两个线程间共享数据?

  • 通过共享对象(用wait和notify方法)

  • 使用像阻塞队列这样并发的数据结构

Java中notify 和 notifyAll有什么区别?

  • notify()方法不能唤醒某个具体的线程,所以只有一个线程在等待的时候它才有用武之地

  • notifyAll()唤醒所有线程并允许他们争夺锁确保了至少有一个线程能继续运行

为什么wait, notify 和 notifyAll这些方法不在thread类里面?

  • 由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义在Object类中因为锁属于对象

  • JAVA提供的锁是对象级的而不是线程级的