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. python构建bp神经网络_曲线拟合(一个隐藏层)__2.代码实现

    IDE:jupyter 抽象程度可能不是那么高,以后再优化. 理论和代码实现的差距还是挺大的 数据集请查看 python构建bp神经网络(一个隐藏层)__1.数据可视化 部分代码预览 git上传.ip ...

  2. MT【210】四点共圆+角平分线

    (2018全国联赛解答最后一题)在平面直角坐标系$xOy$中,设$AB$是抛物线$y^2=4x$的过点$F(1,0)$的弦,$\Delta{AOB}$的外接圆交抛物线于点$P$(不同于点$A,O,B$ ...

  3. 洛谷P2257 YY的GCD

    今日份是数论 大概是..从小学奥数到渐渐毒瘤 那就简单列一下目录[大雾 同余 质数密度 唯一分解定理 互质 完全剩余系 简化剩余系 欧拉函数 逆元 斐蜀定理 阶(及其性质) 欧拉定理 费马小定理 原根 ...

  4. 自学Aruba7.4-Aruba安全认证-MAC认证(web页面配置)

    点击返回:自学Aruba之路 自学Aruba7.4-Aruba安全认证-MAC认证(web页面配置) 由于前三节已经讲述了3种如何web页面配置安全认证,MAC认证就不过多讲解重复的步骤. 步骤1  ...

  5. [luogu4264][USACO18FEB]Teleportation

    题解 先吐槽一波题目:便便传送门,出题人还真的有一点厉害的滑稽. 废话不多说. 首先问题的本质就是求如果当这个传送门的端点位于\(y\)的时候,最小的求出总代价,我们设为函数\(f(y)\). 因为这 ...

  6. 并发容器——ConcurrentHashMap

    ConcurreentHashMap的实现原理与使用 ConcurrentHashMap是线程安全且高效的HashMap. 为什么要使用ConcurrentHashMap 在并发编程中使用HashMa ...

  7. JAVA类中获取项目路径

    在java web项目中获取项目的src/main/resource下的文件路径 当前类名.class.getClassLoader().getResource("/").getP ...

  8. 【java】详解native方法的使用

    目录结构: contents structure [+] 关于native关键字 使用native关键字 使用步骤 案例 编写.java文件 编译.java文件 获得.h文件 编写hello.cpp文 ...

  9. Java:读取系统信息

    com.sun.management.OperatingSystemMXBean mxbean = (com.sun.management.OperatingSystemMXBean) Managem ...

  10. 对程序进行package封装

    一.package包 格式:package 代码必须写在源代码文件的第一句, 约定俗成使用公司域名的倒写,之后再加其他. for example: package cn.chuanzhiboke.te ...