今天发现了一段很标准的多线程代码,记得以前也写过,但是没有这个这么小巧和标准。

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();
}
}
} }
}

  这一段代码有意思的是千锤百炼

最新文章

  1. &lt;&lt;小朋友的数字&gt;&gt;核心代码
  2. python之编写三层菜单(第一天)
  3. (转)C# foreach 中获取索引index的方法
  4. 根据BOM和已存在的文件生成文件列表
  5. C语言生成服从均匀分布, 瑞利分布, 莱斯分布, 高斯分布的随机数
  6. OkHttp+Stetho+Chrome调试android网络部分
  7. 20140912-.NET平台技术思维导图
  8. Spring 配置XML文件头部文件格式
  9. Makefile第三讲:终端传值给Makefile、Makefile传值给C++代码
  10. 命令行命令mvn
  11. VS2015试验随手记
  12. 使用jquery-mockjax模拟ajax请求做前台測试
  13. mysql 父子结构排序
  14. 一篇非常全面的freemarker教程
  15. ELK原理与介绍
  16. CS Academy Sliding Product Sum(组合数)
  17. 使用googletest进行C++单元测试(Netbeans为例)
  18. 20172325 2018-2019-2 《Java程序设计》第四周学习总结
  19. ONLYOFFICE连接数20个限制的由来
  20. 【Spring学习笔记-MVC-8.1】SpringMVC之类型转换@initBinder

热门文章

  1. K8S 实用工具之一 - 如何合并多个 kubeconfig?
  2. ChatGPT Java客户端,OpenAi的Java版本SDK已完成,请火速接入。
  3. Django中models的字段
  4. day12_内部类&amp;API
  5. react零基础使用react-redux管理状态全过程(单组件)
  6. Git安装,配置、基本使用
  7. Nodejs杀死本地应用(win)
  8. vue 复制功能
  9. win10多用户
  10. loader的原理