当一个线程完成了一个任务的时候,通知给另外一个线程去处理其它事情。常见例子是生产者与消费者,弄明白这个对学习mq(消息中间件)很有帮助
- 线程通讯要注意事项:
- wait、notify、notifyAll方法都是属于Object对象方法
- wait、notify方法必须要在同步代码块或者同步函数调用
- wait、notify方法必须由锁对象调用
- 一个线程执行了wait方法会释放锁对象的
代码如下:
/**
* 线程通讯(生产者于消费者的例子)
* @author terry
* @date 2018年5月26日
*/
public class ProducerAndConsumer {
public static void main(String[] args) {
Product product = new Product();
product.count = 4;//初始数量4
Thread producer = new Thread(new Producer(product));
Thread consumer = new Thread(new Consumer(product));
consumer.start();
producer.start();
}
}
/**
* 商品
*/
class Product{
int count;//库存
}
/**
* 生产者
*/
class Producer implements Runnable{
private Product product;
public Producer(Product product){
this.product = product;
}
public void run() {
try {
while(true){
synchronized (product) {
Thread.sleep(100);
product.count++;
System.out.println("生产了一件商品,当前库存:"+product.count);
product.notify();
product.wait();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* 消费者
*/
class Consumer implements Runnable{
private Product product;
public Consumer(Product product){
this.product = product;
}
@Override
public void run() {
try {
while(true){
synchronized (product) {
Thread.sleep(100);
product.count--;
System.out.println("消费了一件商品,当前库存:"+product.count);
product.notify();
product.wait();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
打印如下:可以看到是交替执行的
Thread-0生产了一件商品,当前库存:5
Thread-1消费了一件商品,当前库存:4
Thread-0生产了一件商品,当前库存:5
Thread-1消费了一件商品,当前库存:4
Thread-0生产了一件商品,当前库存:5
Thread-1消费了一件商品,当前库存:4
Thread-0生产了一件商品,当前库存:5
Thread-1消费了一件商品,当前库存:4
Thread-0生产了一件商品,当前库存:5
Thread-1消费了一件商品,当前库存:4
Thread-0生产了一件商品,当前库存:5
Thread-1消费了一件商品,当前库存:4