过多的线程同步可能会造成死锁 死锁通俗来讲就是两个或者两个以上线程,占用了对方下一步所需要的资源,多个线程僵持都无法结束任务的状态 生产者和消费者模式是一个多线程同步的经典案例 它利用信号灯来判断线程是否可以执行,可以避免线程的死锁问题 在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实现同步)相关推荐

  1. 6※、线程同步、同步锁、同步代码块的使用、同步锁释放的时机、ReentrantLock可重入锁、公平锁与非公平锁的区别、什么是死锁、线程间的通信(生产者和消费者模式)

    线程锁 1.※线程的同步:(要确保对象锁是一致的) 1.未使用同步锁的抢票 2.使用了同步锁的抢票 3.线程-同步代码块的使用 4.同步方法和代码块的区别 5.同步锁释放的时机 练习:多线程生产手机 ...

  2. java线程(2)——模拟生产者与消费者

    前言: 我们都听说过生产者和消费者的例子吧,现在来模拟一下.生产者生产面包,消费者消费面包.假定生产者将生成出来的面包放入篮子中,消费者从篮子中取.这样,当篮子中没有面包时,消费者不能取.当篮子满了以 ...

  3. java多线程(同步和死锁,生产者和消费者问题)

    首先我们来看看同步与死锁: 所谓死锁.这是A有banana,B有apple. A至B说:你把apple对我来说,,我会banana给你. B至A说:你把banana对我来说,,我会apple给你. 可 ...

  4. 【JAVA多线程】如何解决一个生产者与消费者问题

    如何解决一个生产者与消费者问题 生产者与消费者问题是多线程同步的一个经典问题.生产者和消费者同时使用一块缓冲区,生产者生产商品放入缓冲区,消费者从缓冲区中取出商品.我们需要保证的是,当缓冲区满时,生产 ...

  5. C++线程同步之事件(生产者与消费者问题)

    #include <windows.h> #include <stdio.h>HANDLE g_hSet = NULL; HANDLE g_hClear = NULL; HAN ...

  6. JAVA——利用wait和notify实现生产者和消费者

    经典的消费者和生产者的的实现: 注意事项: 1:在循环里面用wait(),因为当线程获得了锁,但是有可能还没有满足其他条件: 2:公用的缓冲池要用锁机制: 1 package demo; 2 3 im ...

  7. Java实现ActiveMQ之队列的生产者和消费者(一)

    1.创建maven项目,导入pom.xml依赖包 <!--activemq所需依赖jar配置--> <dependency><groupId>org.apache. ...

  8. Java实现ActiveMQ之主题的生产者和消费者(二)

    前言 假如:三个消费者同时关注并且订阅了一个公众号,公众号同时推送N份消息的时候,他们三个各收到的是N份,还是先到先得到全部,还是均分消息呢? 1.创建maven项目,导入pom.xml依赖包 < ...

  9. java的知识点34——线程通信 || 生产者与消费者问题

    线程通信 应用场景:生产者和消费者问题 • 假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取走消费 • 如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待, ...

最新文章

  1. LeetCode 799 JavaScript
  2. Dijkstra算法的思想和数学归纳法
  3. UA MATH571B 试验设计 总结 判断试验类型的例题
  4. 三值的排序 Sorting a Three-Valued Sequence
  5. 动态规划-----------01背包,完全背包与多重背包
  6. Python re module的使用
  7. poj 3125 Printer Queue(STL注意事项)
  8. Linux常用开发环境软件-Redis安装(docker环境下)
  9. 【HDU - 2665】Kth number(区间第K大,主席树,模板)
  10. 洛谷 P1896 状压DP
  11. MODIS数据下载及MRT批处理方法
  12. linux usb有线网卡驱动_Linux系统安装R8169网卡驱动的方法
  13. php 人民币换算美金,美元汇率换算_美国人民币换算器
  14. mybatis plus 生成代码 保存方法主键报错 nested exception is org.apache.ibatis.reflection.ReflectionException: Cou
  15. springAop遇到的问题
  16. future java get_关于 Future get方法的疑问
  17. freertos使用基础
  18. 「Do.024」如何更高效使用MacBook
  19. java推算日期后天_分别用C++和Java写的计算后天的日期code
  20. av_register_all

热门文章

  1. Django的MVT模式
  2. python中使用Django对url路径进行处理
  3. 自己开发的一款基于PagedDataSource的datalist repeater控件,只需要在源程序中添加三行代码,即可实现通用分页
  4. 漫步数学分析番外五(下)
  5. PRML-系列一之1.2.2~1.2.3
  6. Python中用字典的映射来代替switch语句
  7. 自然语言处理 —— 2.7负采样
  8. 吴恩达深度学习 —— 3.11 随机初始化
  9. ubuntu 16.04安装opencv 2.4.9及其关于qt的问题
  10. FastMM FastCode FastMove的使用