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. ansible创建vmware虚拟机

    环境:vmware 虚拟化需求:如果业务部门一次提几十台甚至几百台虚拟机需求,一个个的手动创建肯定耗时 使用ansible vmware_guest 创建虚拟机,避免手动一台一台创建的纯手工 工作废话 ...

  2. poj1068 【模拟】

    Let S = s1 s2...s2n be a well-formed string of parentheses. S can be encoded in two different ways:  ...

  3. startSSL 申请免费的SSL证书

    打开网址https://www.startssl.com/?app=12,选择Sign-up注册. 输入个人注册信息 需注意以下几点:(1)地址必须详细,否则你会收到这样的邮件: Please pro ...

  4. android handler msg的使用 实现进度条

    package com.app.threadtest; import android.app.Activity; import android.os.Bundle; import android.os ...

  5. pyinstaller模块使用

    目前pip install pyinstaller已经成熟 但是还是有一些坑,郁闷了好久,记一下注意点吧. 将py脚本打包成exe文件时,如果导入了非python自带库,则需要将导入的库从site-p ...

  6. Android打造(ListView、GridView等)通用的下拉刷新、上拉自动加载的组件

    原文 http://blog.csdn.net/bboyfeiyu/article/details/39253051       前言 下 拉刷新组件在开发中使用率是非常高的,基本上联网的APP都会采 ...

  7. Hibernate利用@DynamicInsert和@DynamicUpdate生成动态SQL语句

    最近在使用Hibernate4中,发现两个很有奥秘的注解 @DynamicInsert 和 @DynamicUpdate 如果是在配置文件的话那就是dynamic -insert 和 dynamic- ...

  8. 跟我一起学习vue2(学习工程目录)[三]

    查看生成的my-project的工程目录 首先看 build是最终发布的代码存放位置. 我查看了一下目录,里面都是Js文件 config目录里面主要是配置目录,包括端口号.如果开的项目多,可以进入in ...

  9. 代码大片出现报错,请重新编译——Clean

    工作空间中项目莫名大片报错,可能是各种意外原因导致的代码编译错误,可以选 菜单栏的 Project,Clean一下全部项目,系统会自动重新编译所有项目,有时会有奇效.

  10. SIFT特征点检测学习一(转载)

    新手上路,先转载学习tornadomeet的博客:http://www.cnblogs.com/tornadomeet/archive/2012/08/16/2643168.html 特征点检测学习_ ...