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. 整合91平台接入的ANE

    来源:http://www.swfdiy.com/?p=1328 91平台接入的SDK只有objectC版和java版, 现在如果要在AIR里使用SDK,只能编写ANE整合进来. 91SDK = 几个 ...

  2. javascript_16-对象字面量

    JSON与对象字面量相似,仅仅是属性需要使用双引号引号引起. json是描述数据的一种规范 什么是JSON JavaScript Object Notation (JavaScript 对象表示形式) ...

  3. HashMap,HashSet

    HashMap,HashSet 摘自:https://www.cnblogs.com/skywang12345/p/3310887.html#a1 目录 一.    HashMap(键值对形式存取,键 ...

  4. 从SVN资源库下载项目

    1.这个操作和新建Import导入项目差不多,先左上角File--Import--SVN(这个在弹出窗口的下面)平时都是选最上面的General,再点从SVN检出项目. 2.创建新的资源库位置,然后输 ...

  5. VMware Linux系统克隆

    系统克隆 网卡设备无法识别 解决克隆虚拟机后网卡设备无法识别启动问题的方法 一.故障问题 从vmware workstation中克隆(clone)了一个CentOS 6的虚拟机,启动之后发现网卡没有 ...

  6. 51nod 2488 矩形并的面积

    在二维平面上,给定两个矩形,满足矩形的每条边分别和坐标轴平行,求这个两个矩形的并的面积.即它们重叠在一起的总的面积. 收起   输入 8个数,分别表示第一个矩形左下角坐标为(A,B),右上角坐标为(C ...

  7. 思想家:一个http接口的设计

    一个简单的接口,反应出来一些简单的思想. auth_token= xxx post  response (命令) 记住:我们是给第3方提供接口,不是自己使用 问题:平时就知道写代码,文档重视不够,有一 ...

  8. HTTP头部

    10-URI的基本格式以及与URL的区别 HTTP连接的常见流程 从TCP编程上看HTTP请求处理 长连接与短连接 补充一下代理的知识 什么是正向代理,什么是反向代理? 想在外部公网访问公司内部局域网 ...

  9. Java实现数组元素反转

    package com.fgy.demo; /** * 数组元素反转 */ public class demo05 { public static void main(String[] args) { ...

  10. 微信扫描二维码跳转手机默认浏览器打开下载app的链接是怎么实现的

    此方法可以实现微信内置浏览器跳转到手机其它浏览器,现在网上其它的方法都只是一个页面,让访问者自己手动点右上角浏览器打开,而这个不同,是可以直接自动跳转的. <?php error_reporti ...