文档章节

(二)多个生产者多个消费者,给包子编号 ,用lock

f
 flyqilong
发布于 2016/01/02 15:53
字数 267
阅读 6
收藏 0
package com.ProudceCustom;
import java.util.ArrayList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ProduceCustom {
public static void main(String[] args) {
produce p1 = new produce();
produce p2 = new produce();
p1.setName("生产者1");
p2.setName("生产者1");
custom c1 = new custom();
custom c2 = new custom();
c1.setName("消费者1");
c2.setName("消费者2");
p1.start();
p2.start();
c1.start();
c2.start();
}
}
class Baozi{
public  int id;
}
class Basket{
public  static ArrayList<Baozi> list=new ArrayList<Baozi>();
public static int sum=6;
public static  int i;
public  static Lock lock=new ReentrantLock();
public  static Condition p=lock.newCondition();
public  static Condition c=lock.newCondition();
}
class produce extends Thread{
@Override
public void run() {
while(true){
Basket.lock.lock();
while(Basket.list.size()>=Basket.sum){
try {
Basket.p.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Baozi bz=new Baozi();
Basket.i++;
bz.id=Basket.i;
            try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
        // 添加到数组中。
            Basket.list.add(bz);
            System.out.println(Thread.currentThread().getName()
+ "生产了一个包子:" + bz.id + ",现有" + Basket.list.size());
         // 唤醒对方(生产者)
            Basket.c.signal();
            Basket.lock.unlock();
}
}
}
class custom extends Thread{
@Override
public void run() {
while(true){
Basket.lock.lock();
while(Basket.list.size()==0){
try {
Basket.c.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int index = (int) (Math.random() * Basket.list.size());
Baozi baozi2 = Basket.list.remove(index);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ "消费了一个包子,id为" + baozi2.id + ",现有"
+ Basket.list.size());
//唤醒对方
Basket.p.signal();
Basket.lock.unlock();
}
}
}

© 著作权归作者所有

f
粉丝 3
博文 93
码字总数 53900
作品 0
Android工程师
私信 提问
Java实现生产者-消费者模型

考查Java的并发编程时,手写“生产者-消费者模型”是一个经典问题。有如下几个考点: 对Java并发模型的理解 对Java并发编程接口的熟练程度 bug free coding style JDK版本:oracle java 1.8...

monkeysayhi
2017/11/20
0
0
并发编程之BlockingQueue(二)

前言: 咱们扒光系列的第一篇文章已经对concurrent包中的三层结构的第一层和第二层做了解析,并且对第三层中的lock做了详细的代码分析,本篇博文将针对BlockingQueue这个后续会在执行器里使用...

后厂村老司机
2018/05/24
0
0
Python自动化开发学习9-多线程、队列

threading 模块 先理解一下进程与线程的概念和区别,然后通过threading模块来学习理解线程。进程要下次讲了。之后看一下两种调用线程的方式,效果和实现都一样。貌似也没有什么时候用哪种,反...

骑士救兵
2017/12/23
0
0
Java实现生产者-消费者模型

考查Java的并发编程时,手写“生产者-消费者模型”是一个经典问题。有如下几个考点: 对Java并发模型的理解 对Java并发编程接口的熟练程度 bug free coding style JDK版本:oracle java 1.8...

猴子007
2017/10/16
0
0
多线程(三)

多线程间的通信 本文继续接着讲解多线程,这儿会涉及到多线程的高级部分——多线程间的通信。 多线程间的通信其实就是多个线程都在处理同一个资源,但是处理的任务却不一样。最经典的案例就是...

yerenyuan_pku
2017/10/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

typescript 接口 函数类型 可索引类型

函数类型 可索引类型 数字索引签名 字符串索引签名 数字索引签名返回值 必须是 字符串索引签名返回值的子集 只读索引签名

lilugirl
今天
3
0
Oracle SQL语法实例合集

如需转载请注明出处https://my.oschina.net/feistel/blog/3052024 目的:迅速激活Oracle SQL 参考:《Oracle从入门到精通》 ------------------------------------------------------------......

LoSingSang
今天
2
0
增加 PostgreSQL 服务进程的最大打开文件数

https://serverfault.com/questions/628610/increasing-nproc-for-processes-launched-by-systemd-on-centos-7 要在systemd的配置里加才行...

helloclia
今天
2
0
组合模式在商品分类列表中的应用

在所有的树形结构中最适合的设计模式就是组合模式,我们看看常用商品分类中如何使用。 先定义一个树形结构的商品接口 public interface TreeProduct { List<TreeProduct> allProducts(...

算法之名
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部