线程间通信
概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却有不相同
比如说,线程A用来生产一个娃哈哈饮料,线程B用来消费娃哈哈饮料,娃哈哈饮料可以理解为同一资源,线程A与线程B处理的动作,一个是生产,一个是消费,那么线程A与线程B之间就存在线程通信问题。
图例如下:
为什么要处理线程之间的通信:
多个线程并发在执行时,在默认情况下CPU是随机切换线程的,当我们需要多个线程共同来完成一件任务时,并且我们希望他们有规律的执行,那么多线程之间就需要一些协调通信,以此来帮助我们达到多线程共同操作一份数据。
如何保证线程间通信有效利用资源:
多个线程在处理同一个资源的时候,并且任务还不相同,需要线程通信来帮助我们解决线程之间对同一个变量的使用或者操作。就是多个线程在操作同一份数据时,避免对同一共享变量的争夺,也就是我们需要通过一定的手段使各个线程有效的利用资源。
而这种手段就是----->等待唤醒机制。
等待唤醒机制
什么是等待唤醒机制呢?
这是多个线程间的一种***协作***机制。
就是一个线程进行了规定操作后,就进入到了等待状态(wait()),等待其他线程执行完他们的指定代码后,再将其唤醒(notify());
在有多个线程进行等待时,如果需要,可以使用notifyAll()来唤醒所有的等待线程。
wait/notify就是线程间的一种协作机制。
等待唤醒中的方法:
等待唤醒机制就是用来解决线程间通信问题的。可以使用到的方法有三个如下:
- wait():线程不再活动,不再参与调度,进入到wait set中,因此不会浪费CPU资源,也不再去竞争锁,这时的线程状态就是WAITING。他还要等待着别的线程执行一个特别的动作,就是唤醒通知(notify)在这个对象上等待的线程从wait set中释放出来,重新进入到调度队列(ready queue)中
- wait方法与notify方法是属于Object类的方法的。因为,锁对象可以是任意对象,而任意对象的所属类都是继承了Object类的
- wait方法与notify方法必须要在同步代码块或者同步方法中使用。因为,必须通过锁对象调用这俩个方法来实现等待与唤醒