多线程模拟生产者消费者示例之wait/notify
public class Test {
public static void main(String[] args) throws InterruptedException {
List<String> queue = new ArrayList<>();
new Thread(new PThread(queue)).start();
new Thread(new CThread(queue)).start();
}
}
/**
* 生产者
*/
class PThread implements Runnable {
private List<String> queue;
private AtomicInteger i = new AtomicInteger();
public PThread(List<String> queue) {
this.queue = queue;
}
@Override
public void run() {
while (true) {
synchronized(queue){
//如果queue有元素,那么就释放锁吧
if (queue.size() == 1) {
try {
queue.wait();// 释放锁
} catch (InterruptedException e) {
e.printStackTrace();
}
} else { //没有元素就生产一个元素
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
String data = i.getAndIncrement() + "";
queue.add(data);
System.out.println("生产者线程,生产一个元素:"+data);
queue.notify(); //唤醒本线程,就可以获取锁了
}
}
}
}
}
/**
* 消费者
*/
class CThread implements Runnable {
private List<String> queue;
public CThread(List<String> queue) {
this.queue = queue;
}
@Override
public void run() {
while (true) {
synchronized (queue) {
//如果queue中没有元素,就释放锁,让生产者去生产
if (queue.size() == 0) {
try {
queue.wait(); //就释放锁
} catch (InterruptedException e) {
e.printStackTrace();
}
} else { //消费元素
String data = queue.remove(0);
System.out.println("消费者线程,消费一个元素:"+data);
queue.notify();
}
}
}
}
}

多线程模拟生产者消费者示例之wait/notify的更多相关文章
- 多线程模拟生产者消费者示例之Lock
public class Test { public static void main(String[] args) { List<String> list = new ArrayList ...
- 多线程模拟生产者消费者示例之BlockQueue
public class Test { public static void main(String[] args){ //创建一个阻塞队列,边界为1 BlockingQueue<String& ...
- java多线程模拟生产者消费者问题,公司面试常常问的题。。。
package com.cn.test3; //java多线程模拟生产者消费者问题 //ProducerConsumer是主类,Producer生产者,Consumer消费者,Product产品 // ...
- 【多线程】--生产者消费者模式--Lock版本
在JDK1.5发布后,提供了Synchronized的更优解决方案:Lock 和 Condition 我们使用这些新知识,来改进例子:[多线程]--生产者消费者模式--Synchronized版本 改 ...
- Android-Java多线程通讯(生产者 消费者)&10条线程对-等待唤醒/机制的管理
上一篇博客 Android-Java多线程通讯(生产者 消费者)&等待唤醒机制 是两条线程(Thread-0 / Thread-1) 在被CPU随机切换执行: 而今天这篇博客是,在上一篇博客A ...
- java多线程解决生产者消费者问题
import java.util.ArrayList; import java.util.List; /** * Created by ccc on 16-4-27. */ public class ...
- Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例
Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例 本文由 TonySpark 翻译自 Javarevisited.转载请参见文章末尾的要求. Java.util.concurr ...
- Java多线程_生产者消费者模式2
在我的上一条博客中,已经介绍到了多线程的经典案列——生产者消费者模式,但是在上篇中用的是传统的麻烦的非阻塞队列实现的.在这篇博客中我将介绍另一种方式就是:用阻塞队列完成生产者消费者模式,可以使用多种阻 ...
- 进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼
1. 操作系统基本知识,进程,线程 CPU是计算机的核心,承担了所有的计算任务: 操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件:那么操作系统是如何进行任务调度的呢? ...
随机推荐
- 给网页标题添加icon小图标
so easy: 给网页标题添加icon小图标: 直接在html文件的head部分添加下面代码(注意href的路径): <link rel="icon" type=" ...
- scrapy xpath xpath('---').xpath('string(.)') 提取子元素全部文本
product.xpath("div//div[@class='a-row a-spacing-mini'][1]/div[2]").xpath('string(.)')
- Windows命令学习
总: 1.window dos命令不区分大小写 2.指令参数 /a -a 等价 更倾向于 / 3.命令有疑问: CMD输入help 或者单条命令 /? help time /? 用到的实用命令总 ...
- 【转载】Spring boot学习记录(二)-配置文件解析
前言:本系列文章非本人原创,转自:http://tengj.top/2017/04/24/springboot0/ 正文 Spring Boot使用了一个全局的配置文件application.prop ...
- Web控件中Eval()的使用
1.使用Eval()绑定数据时使用三元运算符 <%#Eval("hg_A").ToString()=="1"?"通过":Eval(&q ...
- 10 (H5*) js第10天 正则表达式、深浅拷贝
目录: 1:浅拷贝 2: 深拷贝 3:遍历DOM树 4:正则表达式 5:正则表达式的创建方式 6:字符串中的正则表达式 7:真数组和伪数组 8: escape()和unescapt() 编码和 解 ...
- 使用bootstrap制作网站导航
除了制作选项卡和下拉菜单,bootstrap还能编写出美观的网站导航栏 一.仿知乎导航栏 <body> <nav class="navbar navbar-default ...
- Java_1.Java符号体系
Java符号包含五类:标识符.关键字.常量及字面量.运算符.分隔符 1.标识符 定义:用于标明程序中元素的名字,如类.方法和变量 命名规则: ·由字母.数字.下划线(_)和美元符号($)构成的字母序列 ...
- Codeforces 1061C (DP+滚动数组)
题面 传送门 分析 考虑DP 设\(dp[i][j]\)表示前i个数选出的序列长度为j的方案数 状态转移方程为: \[ dp[i][j]= \begin{cases}dp\left[ i-1\righ ...
- bzoj2176 Strange string(字符串最小表示法)
Time Limit: 10 Sec Memory Limit: 259 MB 给定一个字符串S = {S1, S2, S3 … Sn}, 如果在串SS中, 子串T(|T| = n)为所有长度为n的 ...