java线程通信
生产者 --> 消息队列(缓冲区) --> 消费者
-
synchronized可阻止并发更新同一个共享资源,实现了同步
-
synchronized不能用来实现不同线程之间的消息传递(通信)
java提供了几个方法解决线程之间的通信问题:
-
wait() 表示线程一直等待,直到其他线程通知,会释放锁,与sleep不同,sleep不释放锁
-
wait() 指定等待的毫秒数
-
notify() 唤醒一个处于等待的线程
-
notifyAll() 唤醒同一个对象上所有调用wait()方法的线程,优先级别高的线程先调度
注意:以上方法均是Object类的方法,且只能在同步方法或同步代码块中使用,否则会抛出异常
方式一(管程法): 利用消息队列(缓冲区)
// 测试:生产者消费者模式->利用队列缓冲区解决:管程法
// 生产者,消费者,产品,消息队列(缓冲区)
public class TestThreadNotify {
public static void main(String[] args) {
Queue queue = new Queue();
new Producer(queue).start();
new Consumer(queue).start();
}
}
// 生产者(做鸡)
class Producer extends Thread{
Queue queue;
public Producer(Queue queue){
this.queue = queue;
}
