【多线程】线程通信

  • 1.如果线程之间采用synchronized来保证线程安全,则可以利用wait()、notify()、notifyAll()来实现线程通信
  • 2.wait()方法可以让当前线程释放对象锁并进入阻塞状态
  • 3.notify: notify()方法用于唤醒一个正在等待相应对象锁的线程,使其进入就绪队列,以便在当前线程释放锁后竞争锁,进而得到CPU的执行
  • 4.notifyAll: 用于唤醒所有正在等待相应对象锁的线程,使它们进入就绪队列,以便在当前线程释放锁后竞争锁,进而得到CPU的执行
  • 5.这三个方法都不是Thread类中所声明的方法,而是Object类中声明的方法
  • 6.原因是每个对象都拥有锁,所以让当前线程等待某个对象的锁,当然应该通过这个对象来操作
  • 7.因为当前线程可能会等待多个线程的锁,如果通过线程来操作,就非常复杂了
  • 8.这三个方法都是本地方法,并且被final修饰,无法被重写
  • 9.每个锁对象都有两个队列,一个是就绪队列,一个是阻塞队列
  • 10.就绪队列存储了已就绪(将要竞争锁)的线程,阻塞队列存储了被阻塞的线程
  • 11.当一个阻塞线程被唤醒后,才会进入就绪队列,进而等待CPU的调度
  • 12. 如果线程之间采用Lock来保证线程安全,则可以利用await()、signal()、signalAll()来实现线程通信
  • 13.await()、signal()、signalAll()是Condition接口中的方法,该接口是在Java 1.5中出现的,它用来替代传统的wait+notify实现线程间的协作,它的使用依赖于 Lock
  • 14.相比使用wait+notify,使用Condition的await+signal这种方式能够更加安全和高效地实现线程间协作
  • 15.Condition依赖于Lock接口,生成一个Condition的基本代码是lock.newCondition()
  • 16.Condition 的 await()/signal()/signalAll() 使用都必须在lock保护之内,也就是说,必须在lock.lock()和lock.unlock之间才可以使用
  • 17.Conditon中的await()对应Object的wait(),Condition中的signal()对应Object的notify(),Condition中的signalAll()对应Object的notifyAll()。
  • 18.BlockingQueue,Java 5提供了一个BlockingQueue接口,BlockingQueue是Queue的子接口,主要用途不是作为容器,是作为线程通信的工具
  • 19.BlockingQueue的特征:当生产者线程试图向BlockingQueue中放入元素时,如果该队列已满,则该线程被阻塞;当消费者线程试图从BlockingQueue中取出元素时,如果该队列已空,则该线程被阻塞
  • 20.程序的两个线程通过交替向BlockingQueue中放入元素、取出元素,即可很好地控制线程的通信
  • 20.线程之间需要通信,最经典的场景就是生产者与消费者模型,而BlockingQueue就是针对该模型提供的解决方案

你可能感兴趣的:(多线程,面试,多线程)