等待唤醒案例和线程间通信
作者:互联网
等待唤醒案例:线程之间的通信:
创建一个顾客线程(消费者):告知老板要的包子的种类和数量,调用wait方法,放弃cpu的执行,进入到WALITTNG状态(无限等待)
创建一个老板线程(生产者):花了5秒做包子,做好包子之后,调用notify方法,唤醒顾客吃包子。
注意:
顾客和老板线程必须使用同步代码块包裹起来,保证等待和唤醒只能有一个在执行
同步使用的锁对象必须保证唯—
只有锁对象才能调用wait和notify方法
Object类中的方法:void wait()在其他线程调用此对象的notify()方法或notifyALl()方法前,导致当前线程等待。
void notify:唤醒在此对象监视器上等待的单个线程。会继续执行wait方法之后的代码
举例:
public static void main(String[] args) { final Object o = new Object(); new Thread(){ @Override public void run() { while (true){ synchronized (o){ System.out.println("数量"); try { o.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } }.start(); new Thread(){ @Override public void run() { while (true){ try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (o){ System.out.println("可以吃包子"); o.notify(); } } } }.start(); }
线程间通信:
概念:多个线程在处理同意一个资源,但是处理的动作线程的任务却不同
比如∶线程A用来生成包子的,线程B用来吃包子的,包子可以理解为同一资源,线程A与线程B处理的动作,一个是生产,一个是消费,那么线程A与线程B之间就存在线程通信问题。
为什么要处理线程间通信:
多个线程并发执行时,在默认情况下CPU是随机切换线程的,当我们需要多个线程来共同完成一件任务,并且我们
希望他们有规律的执行,那么多线程之间需要一些协调通信,以此来帮我们达到多线程共同操作一份数据。
如何保证线程间通信有效利用资源:
多个线程在处理同一个资源,并且任务不同时,需要线程通信来帮助解决线程之间对同一个变量的使用或操作。
就是多个线程在操作同一份数据时,避免对同一共享变量的争夺。也就是我们需要通过一定的手段使各个线程能
有效的利用资源。而这种手段即――等待唤醒机制。
图:
搜索
复制
标签:void,间通信,线程,notify,唤醒,包子,wait 来源: https://www.cnblogs.com/12-12-12/p/16461408.html