java 多线程一

java 多线程二

java 多线程三

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 多线程四的更多相关文章

  1. java多线程(四)-自定义线程池

    当我们使用 线程池的时候,可以使用 newCachedThreadPool()或者 newFixedThreadPool(int)等方法,其实我们深入到这些方法里面,就可以看到它们的是实现方式是这样的 ...

  2. Java多线程(四) 线程池

    一个优秀的软件不会随意的创建.销毁线程,因为创建和销毁线程需要耗费大量的CPU时间以及需要和内存做出大量的交互.因此JDK5提出了使用线程池,让程序员把更多的精力放在业务逻辑上面,弱化对线程的开闭管理 ...

  3. java多线程四种实现模板

    假设一个项目拥有三块独立代码块,需要执行,什么时候用多线程? 这些代码块某些时候需要同时运行,彼此独立,那么需要用到多线程操作更快... 这里把模板放在这里,需要用的时候寻找合适的来选用. 总体分为两 ...

  4. Java多线程(四) —— 线程并发库之Atomic

    一.从原子操作开始 从相对简单的Atomic入手(java.util.concurrent是基于Queue的并发包,而Queue,很多情况下使用到了Atomic操作,因此首先从这里开始). 很多情况下 ...

  5. java多线程(四)之同步机制

    1.同步的前提 多个线程 多个线程使用的是同一个锁 2.同步的好处 同步的出现解决了多线程的安全问题 3.同步的弊端 当线程较多时, 因为每个线程都会去判断同步上的锁, 这样是很耗费资源的, 会降低程 ...

  6. java多线程(四)

    一个例子: Account.java 客户实体类 package com.asiainfo.test.thread8; /** * 账户类 * @author luke * */ public cla ...

  7. JAVA多线程(四) Executor并发框架向RabbitMQ推送消息

    github代码地址: https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service ...

  8. Java多线程——<四>让线程有返回值

    一.概述 到目前为止,我们已经能够声明并使一个线程任务运行起来了.但是遇到一个问题:现在定义的任务都没有任何返回值,那么加入我们希望一个任务运行结束后告诉我一个结果,该结果表名任务执行成功或失败,此时 ...

  9. Java多线程——<八>多线程其他概念

    一.概述 到第八节,就把多线程基本的概念都说完了.把前面的所有文章加连接在此: Java多线程——<一>概述.定义任务 Java多线程——<二>将任务交给线程,线程声明及启动 ...

随机推荐

  1. MVC DropDownList

    最近发现一个 MVC中绑定前台DropDownList , 并且设置默认选中项的简单方法. 直接上代码 方案一 Action:  ViewData["goodsTypeList"] ...

  2. Ouroboros Snake POJ - 1392(数位哈密顿回路)

    看hdu 2894的题意  两个题一样 旋转鼓的表面分成m块扇形,如图所示(m=8).图中阴影区表示用导电材料制成,空白区用绝缘材料制成,终端a.b和c是3(k=3)处接地或不是接地分别用二进制信号0 ...

  3. 【HDU5778】abs(数学)

    BUPT2017 wintertraining(16) #4 C HDU - 5778 题意 给定x,找出使|y-x|最小,且每个质因子都出现两次的y(\(y\le 2\))50组测试数据,\(1\l ...

  4. HTML 浏览器对象 讲解

    Window对象 Ø  属性 •    Document:文档对象 •    Event:事件对象 •    History:历史记录对象 •    Location:位置对象 •    Name:w ...

  5. 丢手帕问题 (约瑟夫问题)Java实现

    问题: 丢手帕游戏是约瑟夫问题的一个变种,游戏很简单,N个小孩围成一个圈,标号为1到N,从编号为m的小孩开始报数,报到第L个小孩退出游戏,然后下一个小孩继续从1开始报数,数到第L个小孩退出游戏,如此循 ...

  6. 【Luogu4723】线性递推(常系数齐次线性递推)

    [Luogu4723]线性递推(常系数齐次线性递推) 题面 洛谷 题解 板子题QwQ,注意多项式除法那里每个多项式的系数,调了一天. #include<iostream> #include ...

  7. Java NIO -- 管道 (Pipe)

    Java NIO 管道是2个线程之间的单向数据连接. Pipe有一个source通道和一个sink通道.数据会被写到sink通道,从source通道读取. 举个例子: package com.soyo ...

  8. 序列自动机—— [FJOI2016]所有公共子序列问题

    序列自动机: 是一个处理子序列的自动机.就这样. 建造:(By猫老师:immoralCO猫) s[] next[][] memset(next[n], -, <<); for(int i ...

  9. (转)如何修改maven的默认jdk版本

    背景:在maven的配置文件中配置编译的jdk插件,就不需要在eclipse中进行重新的指定了. 问题 1.创建maven项目的时候,jdk版本是1.5版本,而自己安装的是1.7或者1.8版本. 2. ...

  10. 20145215《网络对抗》Exp3 免杀原理与实践

    20145215<网络对抗>Exp3 免杀原理与实践 基础问题回答 杀软是如何检测出恶意代码的? 基于特征来检测:恶意代码中一般会有一段有较明显特征的代码也就是特征码,如果杀毒软件检测到有 ...