wait notify 实例,生产消费者模式(转)
2024-10-21 15:35:57
今天发现了一段很标准的多线程代码,记得以前也写过,但是没有这个这么小巧和标准。
import java.util.LinkedList;
import java.util.Queue;
import java.util.Random; /**
* Simple Java program to demonstrate How to use wait, notify and notifyAll()
* method in Java by solving producer consumer problem.
*
* @author Javin Paul
*/
public class ProducerConsumerInJava {
public static void main(String args[]) {
System.out.println("How to use wait and notify method in Java");
System.out.println("Solving Producer Consumper Problem");
Queue<Integer> buffer = new LinkedList<>();
int maxSize = 10;
Thread producer = new Producer(buffer, maxSize, "PRODUCER");
Thread consumer = new Consumer(buffer, maxSize, "CONSUMER");
producer.start();
consumer.start();
} /**
* Producer Thread will keep producing values for Consumer
* to consumer. It will use wait() method when Queue is full
* and use notify() method to send notification to Consumer
* Thread.
*
* @author WINDOWS 8
*/
static class Producer extends Thread {
private Queue<Integer> queue;
private int maxSize; public Producer(Queue<Integer> queue, int maxSize, String name) {
super(name);
this.queue = queue;
this.maxSize = maxSize;
} @Override
public void run() {
while (true) {
synchronized (queue) {
while (queue.size() == maxSize) {
try {
System.out.println("Queue is full, " + "Producer thread waiting for " + "consumer to take something from queue");
queue.wait();
} catch (Exception ex) {
ex.printStackTrace();
}
}
Random random = new Random();
int i = random.nextInt();
System.out.println("Producing value : " + i);
queue.add(i);
queue.notifyAll();
}
}
}
} /**
* Consumer Thread will consumer values form shared queue.
* It will also use wait() method to wait if queue is
* empty. It will also use notify method to send
* notification to producer thread after consuming values
* from queue.
*
* @author WINDOWS 8
*
*/
static class Consumer extends Thread {
private Queue<Integer> queue;
private int maxSize; public Consumer(Queue<Integer> queue, int maxSize, String name) {
super(name);
this.queue = queue;
this.maxSize = maxSize;
} @Override
public void run() {
while (true) {
synchronized (queue) {
while (queue.isEmpty()) {
System.out.println("Queue is empty," + "Consumer thread is waiting" + " for producer thread to put something in queue");
try {
queue.wait();
} catch (Exception ex) {
ex.printStackTrace();
}
}
System.out.println("Consuming value : " + queue.remove());
queue.notifyAll();
}
}
} }
}
这一段代码有意思的是千锤百炼
最新文章
- <;<;小朋友的数字>;>;核心代码
- python之编写三层菜单(第一天)
- (转)C# foreach 中获取索引index的方法
- 根据BOM和已存在的文件生成文件列表
- C语言生成服从均匀分布, 瑞利分布, 莱斯分布, 高斯分布的随机数
- OkHttp+Stetho+Chrome调试android网络部分
- 20140912-.NET平台技术思维导图
- Spring 配置XML文件头部文件格式
- Makefile第三讲:终端传值给Makefile、Makefile传值给C++代码
- 命令行命令mvn
- VS2015试验随手记
- 使用jquery-mockjax模拟ajax请求做前台測试
- mysql 父子结构排序
- 一篇非常全面的freemarker教程
- ELK原理与介绍
- CS Academy Sliding Product Sum(组合数)
- 使用googletest进行C++单元测试(Netbeans为例)
- 20172325 2018-2019-2 《Java程序设计》第四周学习总结
- ONLYOFFICE连接数20个限制的由来
- 【Spring学习笔记-MVC-8.1】SpringMVC之类型转换@initBinder