线程通信:多个线程在处理同一个资源,处理动作(线程任务)不同。
例如:包子生产消费问题。消费线程和生产线程处理同一资源包子,这时候根据资源包子的状态问题消费线程和生产线程就存在通信问题。
为什么要处理多线程通信问题:在多线程的并发执行时,默认CUP随机切换线程,当我们需要使用多线程完成一项任务时,我们希望多个线程能有规律的执行,这是我们就需要线程之前协调通信,以此达到共享一份数据。
等待唤醒机制:线程执行规定的操作后进入等待状态(wait),在其他线程完成指定任务代码后将其唤醒(notify)。
Java线程通信
- java.lang.Object
void |
导致当前线程等待,直到另一个线程调用该对象的 notify()方法或 notifyAll()方法。 |
void | wait(long timeout) 导致当前线程等待,直到另一个线程调用 notify()方法或该对象的 notifyAll()方法,或者指定的时间已过。 |
void | notify() 唤醒正在等待对象监视器的单个线程。 |
void | notifyAll() 唤醒正在等待对象监视器的所有线程。 |
消费者/生产者/包子例子:
共享资源:包子(多线程下实现对包子的同步线程操作),
生产者:a.无包子时生产包子唤醒消费者线程吃包子。b.有包子时进入等待状态(直到包子被消耗,消费者唤醒继续生产)。
消费者:a.无包子是进入等待状态。b.有包子时消耗包子,唤醒生产者线程生产包子。
包子类实现:重写toString()以便于在System.out.println()直接输出XX馅包子。
生产者类实现:线程类,实现当有包子(flag = true)时wait。没有包子是生产包子唤醒notify消费者线程吃包子。
消费者类实现
Test类实现
运行测试