java 线程同步的list_java线程生产者与消费者实例(使用List实现同步)
过多的线程同步可能会造成死锁 死锁通俗来讲就是两个或者两个以上线程,占用了对方下一步所需要的资源,多个线程僵持都无法结束任务的状态 生产者和消费者模式是一个多线程同步的经典案例 它利用信号灯来判断线程是否可以执行,可以避免线程的死锁问题 在java
学习java线程的时候,看到生产者与消费者例子,有感而发。
下面是模拟汽车生产商和顾客(权当消费者可以直接从厂家买到汽车),废话不说,上代码。
package com.zx.thread.work;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 我们模拟一个生产者和消费者购买汽车的例子
*
* @author maping
*
*/
public class ProducerAndConsumer {
//厂家存放汽车的车间
private static List cars = new ArrayList();
static void test(int producers, int consumers) {
ExecutorService exec = Executors.newCachedThreadPool();
for (int i = 0; i < producers; i++) {
// 上海大众的producers个分厂分别生产了100台polo车
exec.execute(new CarProducer("上海大众", cars, 100, i));
}
for (int i = 0; i < consumers; i++) {
// 消费者张三的consumers亲戚分别买10台polo
exec.execute(new CarConsumer("张三", cars, 10, i));
}
exec.shutdown();
}
public static void main(String[] args) throws FileNotFoundException {
test(100, 1000);
}
}
/**
汽车类
*/
class Car {
private String name = "polo";
private int id;
private CarProducer producer;
public Car() {
}
public Car(CarProducer producer, String name, int id) {
this.producer = producer;
this.name = name;
this.id = id;
}
public String toString() {
return this.producer.getName() + "#" + this.producer.getId() + "#"
+ this.getClass().getSimpleName() + "#" + name + "#" + id;
}
}
/*
汽车制造厂商
*/
class CarProducer implements Runnable {
private int count;
private List cars;
private String name;
private int id;
public CarProducer(String name, List cars, int count, int id) {
this.name = name;
this.cars = cars;
this.count = count;
this.id = id;
}
public void addCar(int ids) {
System.out.println(this.name + "#" + id + ">>开始生产汽车" + ids);
//此处同步cars,如果使用BlockingQueue,则无需同步代码
synchronized (cars) {
cars.add(new Car(this, name, ids));
//车间里面有了刚刚制造好的汽车,那么就可以通知消费者来买了
cars.notifyAll();
}
}
public void run() {
for (int i = 0; i < count; i++) {
this.addCar(i);
}
}
public String getName() {
return name;
}
public int getId() {
return id;
}
}
/**
消费者
*/
class CarConsumer implements Runnable {
private List cars;
private int count;
private String name;
private int id;
public CarConsumer(String name, List cars, int count, int id) {
this.name = name;
this.cars = cars;
this.count = count;
this.id = id;
}
public void buyCar() throws InterruptedException {
//消费者购买汽车时,锁定汽车对象
synchronized (cars) {
System.out.println(name + "#" + id + ">>" + "开始选车");
int waitTime = 10 * 1000;
//消费者刚刚来到汽车存放的车间时,如果发现
//车间还没有汽车,那么他只能等待,这里设置了超时时间,如果
//超过指定时间,则一气走之,相当于抛出异常了
while (cars.isEmpty()) {
System.out.println("[" + name + "#" + id + "]当前车缺货,等待"
+ waitTime + "毫秒");
wait(waitTime);
}
//有汽车来了,则个时候就可以买汽车了
Car car = cars.remove(0);
System.out.println("[" + name + "#" + id + "]" + "买到车了" + car);
System.out.println("***************************");
System.err.println("当前库存为\n" + cars.size());
}
}
public void run() {
while (count-- > 0) {
try {
buyCar();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
生产者消费者-线程-链表-队列实现 链表实现 #include#include#include#includepthread_mutex_t lock;pthread_cond_t cond;struct node{ int iValue; struct node *next;}*head = NULL;void custo
这段代码在生产者线程制造的汽车数>=消费者线程购买的汽车数时,没有任何问题,当反之的时候,就会由于
等待制造商生产汽车,而此时制造商或许不再制造汽车了,那么就会抛出异常。
我在思考,比如MQ的消息队列是怎么做到那么高效率呢
java 线程同步的list_java线程生产者与消费者实例(使用List实现同步)相关推荐
- 6※、线程同步、同步锁、同步代码块的使用、同步锁释放的时机、ReentrantLock可重入锁、公平锁与非公平锁的区别、什么是死锁、线程间的通信(生产者和消费者模式)
线程锁 1.※线程的同步:(要确保对象锁是一致的) 1.未使用同步锁的抢票 2.使用了同步锁的抢票 3.线程-同步代码块的使用 4.同步方法和代码块的区别 5.同步锁释放的时机 练习:多线程生产手机 ...
- java线程(2)——模拟生产者与消费者
前言: 我们都听说过生产者和消费者的例子吧,现在来模拟一下.生产者生产面包,消费者消费面包.假定生产者将生成出来的面包放入篮子中,消费者从篮子中取.这样,当篮子中没有面包时,消费者不能取.当篮子满了以 ...
- java多线程(同步和死锁,生产者和消费者问题)
首先我们来看看同步与死锁: 所谓死锁.这是A有banana,B有apple. A至B说:你把apple对我来说,,我会banana给你. B至A说:你把banana对我来说,,我会apple给你. 可 ...
- 【JAVA多线程】如何解决一个生产者与消费者问题
如何解决一个生产者与消费者问题 生产者与消费者问题是多线程同步的一个经典问题.生产者和消费者同时使用一块缓冲区,生产者生产商品放入缓冲区,消费者从缓冲区中取出商品.我们需要保证的是,当缓冲区满时,生产 ...
- C++线程同步之事件(生产者与消费者问题)
#include <windows.h> #include <stdio.h>HANDLE g_hSet = NULL; HANDLE g_hClear = NULL; HAN ...
- JAVA——利用wait和notify实现生产者和消费者
经典的消费者和生产者的的实现: 注意事项: 1:在循环里面用wait(),因为当线程获得了锁,但是有可能还没有满足其他条件: 2:公用的缓冲池要用锁机制: 1 package demo; 2 3 im ...
- Java实现ActiveMQ之队列的生产者和消费者(一)
1.创建maven项目,导入pom.xml依赖包 <!--activemq所需依赖jar配置--> <dependency><groupId>org.apache. ...
- Java实现ActiveMQ之主题的生产者和消费者(二)
前言 假如:三个消费者同时关注并且订阅了一个公众号,公众号同时推送N份消息的时候,他们三个各收到的是N份,还是先到先得到全部,还是均分消息呢? 1.创建maven项目,导入pom.xml依赖包 < ...
- java的知识点34——线程通信 || 生产者与消费者问题
线程通信 应用场景:生产者和消费者问题 • 假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取走消费 • 如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待, ...
最新文章
- LeetCode 799 JavaScript
- Dijkstra算法的思想和数学归纳法
- UA MATH571B 试验设计 总结 判断试验类型的例题
- 三值的排序 Sorting a Three-Valued Sequence
- 动态规划-----------01背包,完全背包与多重背包
- Python re module的使用
- poj 3125 Printer Queue(STL注意事项)
- Linux常用开发环境软件-Redis安装(docker环境下)
- 【HDU - 2665】Kth number(区间第K大,主席树,模板)
- 洛谷 P1896 状压DP
- MODIS数据下载及MRT批处理方法
- linux usb有线网卡驱动_Linux系统安装R8169网卡驱动的方法
- php 人民币换算美金,美元汇率换算_美国人民币换算器
- mybatis plus 生成代码 保存方法主键报错 nested exception is org.apache.ibatis.reflection.ReflectionException: Cou
- springAop遇到的问题
- future java get_关于 Future get方法的疑问
- freertos使用基础
- 「Do.024」如何更高效使用MacBook
- java推算日期后天_分别用C++和Java写的计算后天的日期code
- av_register_all
热门文章
- Django的MVT模式
- python中使用Django对url路径进行处理
- 自己开发的一款基于PagedDataSource的datalist repeater控件,只需要在源程序中添加三行代码,即可实现通用分页
- 漫步数学分析番外五(下)
- PRML-系列一之1.2.2~1.2.3
- Python中用字典的映射来代替switch语句
- 自然语言处理 —— 2.7负采样
- 吴恩达深度学习 —— 3.11 随机初始化
- ubuntu 16.04安装opencv 2.4.9及其关于qt的问题
- FastMM FastCode FastMove的使用