java 多线程四
一个生产者,消费者的例子:
import java.util.Stack; /**
* Created by root on 17-10-1.
*/
public class Test5 { //商品:APPLE
class Apple {
private int id; public Apple(int id) {
this.id = id;
} @Override
public String toString() {
return "Apple{" +
"id=" + id +
'}';
}
} //存放商品的仓库
class Repositorie {
Stack<Apple> capacity = new Stack<>();
int MAXSIZE = 10; public synchronized void putApple(Apple apple) throws InterruptedException {
if (capacity.size() < MAXSIZE) {
capacity.push(apple);
System.out.println(Thread.currentThread().getName()+"生产Apple>>>" + apple.toString());
notify();
} else {
wait();
}
} public synchronized void getApple() throws InterruptedException {
if (capacity.size() > 0) {
System.out.println(" "+Thread.currentThread().getName()+"消费Apple<<<" + capacity.pop().toString());
notify();
} else {
wait();
}
} public void close(){
while (true){
//卖完了就打烊
if (capacity.size()==0){
System.exit(0);
} } }
} //生产者
class Producer implements Runnable {
int NUM=20;//一共生产20个商品
private Repositorie repositorie; public Producer(Repositorie repositorie) {
this.repositorie = repositorie;
} @Override
public void run() { for (; NUM>0; ) {
try {
repositorie.putApple(new Apple(NUM--));
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
repositorie.close();
}
} //消费者
class Consume implements Runnable { private Repositorie repositorie; public Consume(Repositorie repositorie) {
this.repositorie = repositorie;
} @Override
public void run() {
//不知道有多少商品
for (;true;) {
try {
repositorie.getApple();
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
} }
} public static void main(String[] args) {
Test5 test5 = new Test5();
Repositorie repositorie = test5.new Repositorie();
Producer producer = test5.new Producer(repositorie);
Consume consume = test5.new Consume(repositorie);
Thread p1 = new Thread(producer,"工人1");
Thread p2 = new Thread(producer,"工人2");
Thread c1 = new Thread(consume,"客户1");
Thread c2 = new Thread(consume,"客户2");
p1.start();
p2.start();
c1.start();
c2.start();
}
}
结果:
工人1生产Apple>>>Apple{id=20}
工人2生产Apple>>>Apple{id=19}
客户2消费Apple<<<Apple{id=19}
客户1消费Apple<<<Apple{id=20}
工人1生产Apple>>>Apple{id=18}
工人2生产Apple>>>Apple{id=17}
工人1生产Apple>>>Apple{id=16}
工人2生产Apple>>>Apple{id=15}
工人1生产Apple>>>Apple{id=14}
客户1消费Apple<<<Apple{id=14}
客户2消费Apple<<<Apple{id=15}
工人2生产Apple>>>Apple{id=13}
工人1生产Apple>>>Apple{id=12}
工人2生产Apple>>>Apple{id=11}
工人1生产Apple>>>Apple{id=10}
工人2生产Apple>>>Apple{id=9}
工人1生产Apple>>>Apple{id=8}
客户1消费Apple<<<Apple{id=8}
客户2消费Apple<<<Apple{id=9}
工人2生产Apple>>>Apple{id=7}
工人1生产Apple>>>Apple{id=6}
工人2生产Apple>>>Apple{id=5}
客户1消费Apple<<<Apple{id=5}
客户2消费Apple<<<Apple{id=6}
工人1生产Apple>>>Apple{id=2}
工人2生产Apple>>>Apple{id=1}
客户1消费Apple<<<Apple{id=1}
客户2消费Apple<<<Apple{id=2}
客户1消费Apple<<<Apple{id=7}
客户2消费Apple<<<Apple{id=10}
客户1消费Apple<<<Apple{id=11}
客户2消费Apple<<<Apple{id=12}
客户1消费Apple<<<Apple{id=13}
客户2消费Apple<<<Apple{id=16}
客户1消费Apple<<<Apple{id=17}
客户2消费Apple<<<Apple{id=18}
java 多线程四的更多相关文章
- java多线程(四)-自定义线程池
当我们使用 线程池的时候,可以使用 newCachedThreadPool()或者 newFixedThreadPool(int)等方法,其实我们深入到这些方法里面,就可以看到它们的是实现方式是这样的 ...
- Java多线程(四) 线程池
一个优秀的软件不会随意的创建.销毁线程,因为创建和销毁线程需要耗费大量的CPU时间以及需要和内存做出大量的交互.因此JDK5提出了使用线程池,让程序员把更多的精力放在业务逻辑上面,弱化对线程的开闭管理 ...
- java多线程四种实现模板
假设一个项目拥有三块独立代码块,需要执行,什么时候用多线程? 这些代码块某些时候需要同时运行,彼此独立,那么需要用到多线程操作更快... 这里把模板放在这里,需要用的时候寻找合适的来选用. 总体分为两 ...
- Java多线程(四) —— 线程并发库之Atomic
一.从原子操作开始 从相对简单的Atomic入手(java.util.concurrent是基于Queue的并发包,而Queue,很多情况下使用到了Atomic操作,因此首先从这里开始). 很多情况下 ...
- java多线程(四)之同步机制
1.同步的前提 多个线程 多个线程使用的是同一个锁 2.同步的好处 同步的出现解决了多线程的安全问题 3.同步的弊端 当线程较多时, 因为每个线程都会去判断同步上的锁, 这样是很耗费资源的, 会降低程 ...
- java多线程(四)
一个例子: Account.java 客户实体类 package com.asiainfo.test.thread8; /** * 账户类 * @author luke * */ public cla ...
- JAVA多线程(四) Executor并发框架向RabbitMQ推送消息
github代码地址: https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service ...
- Java多线程——<四>让线程有返回值
一.概述 到目前为止,我们已经能够声明并使一个线程任务运行起来了.但是遇到一个问题:现在定义的任务都没有任何返回值,那么加入我们希望一个任务运行结束后告诉我一个结果,该结果表名任务执行成功或失败,此时 ...
- Java多线程——<八>多线程其他概念
一.概述 到第八节,就把多线程基本的概念都说完了.把前面的所有文章加连接在此: Java多线程——<一>概述.定义任务 Java多线程——<二>将任务交给线程,线程声明及启动 ...
随机推荐
- Dining POJ - 3281
题意: f个食物,d杯饮料,每个牛都有想吃的食物和想喝的饮料,但食物和饮料每个只有一份 求最多能满足多少头牛.... 解析: 一道简单的无源汇拆点最大流 无源汇的一个最大流,先建立超级源s和超级汇 ...
- xml文件格式化后不能获取到值
在有些时候,我们要使用到xml文件,必须得将文件中的内容压缩成一行,才能读取到其中的值,一旦有换行符.制表符.空格之类的就读不到.所以只能在开发好以后,将代码压缩再执行,十分不方便. 尝试了几个替换符 ...
- 【CodeForces 624D/623B】Array GCD
题 You are given array ai of length n. You may consecutively apply two operations to this array: remo ...
- 架构师成长之路6.3 DNS服务器搭建(部署单台DNS)
点击返回架构师成长之路 架构师成长之路6.3 DNS服务器搭建(部署单台DNS) 1.安装bind yum -y install bind-utils bind bind-devel bind-chr ...
- [USACO 2018 December Contest]作业总结
t1 Convention 题目大意 每一头牛都有一个来的时间,一共有\(n\)辆车,求出等待时间最长的那头牛等待的最小时间. 解法 第一眼看到这道题还以为是\(2018noip\)普及组的t3魔鬼题 ...
- 【转】用宏定义代替printf函数
问题提出 有时候我们想用宏定义来决定是编译debug版本的代码还是release的代码,dubug版本的代码会通过printf打印调试信息,release版本的代码则不会.我们总不能对每一条print ...
- 面试 -- Http协议相关(转载)
http请求由三部分组成,分别是:请求行.消息报头.请求正文 HTTP(超文本传输协议)是一个基于请求与响应模式的.无状态的.应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接 ...
- Centos6.5 防火墙开放端口
0. 说明 centos6.5处于对安全的考虑,严格控制网络进去.所以在安装mysql或者使用tomcat,需要开放端口3306或8080. 通常的解决办法有两个.一个是直接关闭防火墙(非常不推荐): ...
- C# 面向对象零碎知识点
obgect: 所有数据类型都是obgect类型: 万能类型 var :原来的变量不变,替换成var: 动态类型 dynamic :类似object,遍历需要转: is as: 类型转换运算符: ( ...
- 上下文管理协议with_open,__enter__和__exit__(三十八)
在操作文件对象的时候可以这么写 with open('a.txt') as f: '代码块' 上述叫做上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明__ent ...