public class ProducterConsumerSample {
public static void main(String[] args) {
Resourse res = new Resourse();
//两个生产者
Producter producter1 = new Producter(res);
Producter producter2 = new Producter(res);
//三个消费者
Consumer consumer1 = new Consumer(res);
Consumer consumer2 = new Consumer(res);
Consumer consumer3 = new Consumer(res); Thread t1 = new Thread(producter1);
Thread t2 = new Thread(producter2);
Thread t3 = new Thread(consumer1);
Thread t4 = new Thread(consumer2);
Thread t5 = new Thread(consumer3);
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
/**
* 显示如下
* Thread-1 生产者 ++ 苹果手机---1
* Thread-2 消费者 苹果手机---1
* Thread-0 生产者 ++ 苹果手机---2
* Thread-2 消费者 苹果手机---2
* Thread-0 生产者 ++ 苹果手机---3
* Thread-2 消费者 苹果手机---3
* Thread-0 生产者 ++ 苹果手机---4
* Thread-2 消费者 苹果手机---4
* Thread-0 生产者 ++ 苹果手机---5
* Thread-2 消费者 苹果手机---5
* Thread-0 生产者 ++ 苹果手机---6
* Thread-2 消费者 苹果手机---6
* Thread-0 生产者 ++ 苹果手机---7
* Thread-2 消费者 苹果手机---7
* Thread-0 生产者 ++ 苹果手机---8
* Thread-2 消费者 苹果手机---8
* Thread-0 生产者 ++ 苹果手机---9
* Thread-2 消费者 苹果手机---9
* Thread-0 生产者 ++ 苹果手机---10
* Thread-2 消费者 苹果手机---10
*/
}
} class Resourse {
private int productId = 1;
private String productName;
private boolean flag = false; /**
* 同步函数,解决多线程操作时的安全问题
*/
public synchronized void product(String productName) {
while (flag) { //关键点 此处一定要用while循环
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.productName = productName + "---" + productId++;
System.out.println(Thread.currentThread().getName() + " 生产者 ++ " + this.productName);
flag = true;
this.notifyAll(); //关键点 此处一定要把所有wait线程全部唤醒
} /**
* 同步函数,解决多线程操作时的安全问题
*/
public synchronized void consume() {
while (!flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + " 消费者 " + this.productName);
flag = false;
this.notifyAll();
}
} class Producter implements Runnable { private Resourse res; Producter(Resourse res) {
this.res = res;
} @Override
public void run() {
while (true) {
res.product("苹果手机");
}
}
} class Consumer implements Runnable { private Resourse res; Consumer(Resourse res) {
this.res = res;
} @Override
public void run() {
while (true) {
res.consume();
}
}
}
import java.io.PrintStream;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /**
* 使用lock实现多线程之间的数据通讯和同步
*/
public class ProducterConsumerSample {
public static void main(String[] args) {
Resourse res = new Resourse();
//两个生产者
Producter producter1 = new Producter(res);
Producter producter2 = new Producter(res);
//三个消费者
Consumer consumer1 = new Consumer(res);
Consumer consumer2 = new Consumer(res);
Consumer consumer3 = new Consumer(res); Thread t1 = new Thread(producter1);
Thread t2 = new Thread(producter2);
Thread t3 = new Thread(consumer1);
Thread t4 = new Thread(consumer2);
Thread t5 = new Thread(consumer3);
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
/**
* 显示如下
* Thread-1 生产者 ++ 苹果手机---105851
* Thread-4 消费者 苹果手机---105851
* Thread-0 生产者 ++ 苹果手机---105852
* Thread-2 消费者 苹果手机---105852
* Thread-1 生产者 ++ 苹果手机---105853
* Thread-3 消费者 苹果手机---105853
* Thread-0 生产者 ++ 苹果手机---105854
* Thread-4 消费者 苹果手机---105854
* Thread-1 生产者 ++ 苹果手机---105855
* Thread-2 消费者 苹果手机---105855
* Thread-0 生产者 ++ 苹果手机---105856
* Thread-3 消费者 苹果手机---105856
*/
}
} class Resourse {
private int productId = 1;
private String productName;
private boolean flag = false;
private final Lock lock = new ReentrantLock();
private Condition condition_pro = lock.newCondition(); //生产者Condition
private Condition condition_Cons = lock.newCondition(); //消费者Condition public void product(String productName) {
lock.lock(); //加锁
try {
while (flag) { //关键点 此处一定要用while循环
try {
condition_pro.await(); //生产者等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.productName = productName + "---" + productId++;
System.out.println(Thread.currentThread().getName() + " 生产者 ++ " + this.productName);
flag = true;
condition_Cons.signal(); //唤醒消费者
} finally {
lock.unlock(); //解锁
}
} public void consume() {
lock.lock(); //加锁
try {
while (!flag) {
try {
condition_Cons.await(); //消费者等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + " 消费者 " + this.productName);
flag = false;
condition_pro.signal(); //唤醒生产者
} finally {
lock.unlock(); //解锁
}
}
} class Producter implements Runnable { private Resourse res; Producter(Resourse res) {
this.res = res;
} @Override
public void run() {
while (true) {
res.product("苹果手机");
}
}
} class Consumer implements Runnable { private Resourse res; Consumer(Resourse res) {
this.res = res;
} @Override
public void run() {
while (true) {
res.consume();
}
}
}

  

Java 多线程之生产者消费者(多个生成者多个消费者)synchronized 和lock多线程通讯和同步实现的更多相关文章

  1. Java并发编程:synchronized、Lock、ReentrantLock以及ReadWriteLock的那些事儿

    目录 前言 synchronized用法 修饰方法 修饰实例方法 修饰静态方法 同步代码块 引出Lock Lock用法 子类:ReentrantLock 读写分离锁:ReadWriteLock Loc ...

  2. 【多线程】java多线程实现生产者消费者模式

    思考问题: 1.为什么用wait()+notify()实现生产者消费者模式? wait()方法可以暂停线程,并释放对象锁 notify()方法可以唤醒需要该对象锁的其他线程,并在执行完后续步骤,到了s ...

  3. java多线程解决生产者消费者问题

    import java.util.ArrayList; import java.util.List; /** * Created by ccc on 16-4-27. */ public class ...

  4. java学习多线程之生产者消费者

    在java多线程当中还有一种关系需要我们来重点掌握,那就是生产者和消费者的关系.那么什么是生产者,什么是消费者呢?我们可以举个例子来说,有张三.李四负责生产烤鸭,王五.马六负责吃烤鸭,那么前者生产完烤 ...

  5. Java多线程实现生产者消费者延伸问题

    在操作系统中有一类问题被称为生产者消费者问题:意为,有数个生产者生产产品,有数个消费者消费产品,他们共享一定数量的缓存. 这里用java多线程编程,实现生产者消费者问题的一种延伸,橘子苹果问题. 题目 ...

  6. JAVA之旅(十五)——多线程的生产者和消费者,停止线程,守护线程,线程的优先级,setPriority设置优先级,yield临时停止

    JAVA之旅(十五)--多线程的生产者和消费者,停止线程,守护线程,线程的优先级,setPriority设置优先级,yield临时停止 我们接着多线程讲 一.生产者和消费者 什么是生产者和消费者?我们 ...

  7. Java多线程之生产者消费者问题<一>:使用synchronized keyword解决生产者消费者问题

    今天看了一片博文,讲Java多线程之线程的协作,当中作者用程序实例说明了生产者和消费者问题,但我及其它读者发现程序多跑几次还是会出现死锁,百度搜了下大都数的样例也都存在bug,经过细致研究发现当中的问 ...

  8. java多线程模拟生产者消费者问题,公司面试常常问的题。。。

    package com.cn.test3; //java多线程模拟生产者消费者问题 //ProducerConsumer是主类,Producer生产者,Consumer消费者,Product产品 // ...

  9. JAVA多线程之生产者 消费者模式 妈妈做面包案例

    创建四个类 1.面包类 锅里只可以放10个面包 ---装面包的容器2.厨房 kitchen 生产面包 和消费面包  最多生产100个面包3.生产者4消费者5.测试类 多线程经典案例 import ja ...

随机推荐

  1. Oracle 11g 服务器结构

    Oracle 服务器主要又实例.数据库.程序全局区和前台进程组成. 实例可以进一步划分为系统全局区(SGA)和后台进程(PMON.SMON等)两部分,其中,SGA 使用操作系统的内存资源,而后台进程需 ...

  2. thinkphp5中使用phpmailer实现发送邮件功能

    一.开启SMTP服务(使用php发送邮件需要用到SMTP服务,这里以163邮箱的SMTP服务为例). 1.登录163邮箱,在首页上找到“设置”. 2.选择开启的服务,一般都全选,POP3/SMTP/I ...

  3. python(if判断)

    一.if判断 如果 条件满足,才能做某件事情, 如果 条件不满足,就做另外一件事情,或者什么也不做 注意: 代码的缩进为一个 tab 键,或者 4 个空格 在 Python 开发中,Tab 和空格不要 ...

  4. java计算两个经纬度之间的距离

    /** * 计算点 是否在一个固定点的半径范围内 * @2016年10月20日 * @param a 经度1 已知 * @param b 纬度1 已知 * @param x 经度2 * @param ...

  5. Murach ASP.NET 4.5 C# With Visual Studio 2013 翻译

    本书由我自己翻译完,省略书中练习部分,练习部分可以阅读原文   本书对新手友好,介绍了Web通讯的基本原理,ASP.NET开发,项目开发所需的各种开发与部署技术, Ajax,与WCF, Web API ...

  6. LGOJP4381 [IOI2008]Island

    题目链接 https://www.luogu.org/problem/P4381 题解 基环树直径的板子.但是dfs会爆栈...所以最后改成了bfs.还是一个很考验码力的板子. 首先基环树的直径显然有 ...

  7. CH6302 雨天的尾巴

    6302 雨天的尾巴 0x60「图论」例题 背景 深绘里一直很讨厌雨天. 灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切. 虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了 ...

  8. MyEclipse激活代码

    package TestCase; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr ...

  9. LSTM神经网络输入输出究竟是怎样的?

    LSTM图和词向量输入分析

  10. read_excle

    Signature: pd.read_excel( ['io', 'sheet_name=0', 'header=0', 'skiprows=None', 'skip_footer=0', 'inde ...