Java 多线程之生产者消费者(多个生成者多个消费者)synchronized 和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 生产者 ++ 苹果手机---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多线程通讯和同步实现的更多相关文章
- Java并发编程:synchronized、Lock、ReentrantLock以及ReadWriteLock的那些事儿
目录 前言 synchronized用法 修饰方法 修饰实例方法 修饰静态方法 同步代码块 引出Lock Lock用法 子类:ReentrantLock 读写分离锁:ReadWriteLock Loc ...
- 【多线程】java多线程实现生产者消费者模式
思考问题: 1.为什么用wait()+notify()实现生产者消费者模式? wait()方法可以暂停线程,并释放对象锁 notify()方法可以唤醒需要该对象锁的其他线程,并在执行完后续步骤,到了s ...
- java多线程解决生产者消费者问题
import java.util.ArrayList; import java.util.List; /** * Created by ccc on 16-4-27. */ public class ...
- java学习多线程之生产者消费者
在java多线程当中还有一种关系需要我们来重点掌握,那就是生产者和消费者的关系.那么什么是生产者,什么是消费者呢?我们可以举个例子来说,有张三.李四负责生产烤鸭,王五.马六负责吃烤鸭,那么前者生产完烤 ...
- Java多线程实现生产者消费者延伸问题
在操作系统中有一类问题被称为生产者消费者问题:意为,有数个生产者生产产品,有数个消费者消费产品,他们共享一定数量的缓存. 这里用java多线程编程,实现生产者消费者问题的一种延伸,橘子苹果问题. 题目 ...
- JAVA之旅(十五)——多线程的生产者和消费者,停止线程,守护线程,线程的优先级,setPriority设置优先级,yield临时停止
JAVA之旅(十五)--多线程的生产者和消费者,停止线程,守护线程,线程的优先级,setPriority设置优先级,yield临时停止 我们接着多线程讲 一.生产者和消费者 什么是生产者和消费者?我们 ...
- Java多线程之生产者消费者问题<一>:使用synchronized keyword解决生产者消费者问题
今天看了一片博文,讲Java多线程之线程的协作,当中作者用程序实例说明了生产者和消费者问题,但我及其它读者发现程序多跑几次还是会出现死锁,百度搜了下大都数的样例也都存在bug,经过细致研究发现当中的问 ...
- java多线程模拟生产者消费者问题,公司面试常常问的题。。。
package com.cn.test3; //java多线程模拟生产者消费者问题 //ProducerConsumer是主类,Producer生产者,Consumer消费者,Product产品 // ...
- JAVA多线程之生产者 消费者模式 妈妈做面包案例
创建四个类 1.面包类 锅里只可以放10个面包 ---装面包的容器2.厨房 kitchen 生产面包 和消费面包 最多生产100个面包3.生产者4消费者5.测试类 多线程经典案例 import ja ...
随机推荐
- PCL提取圆柱系数
网上看了很多教程,没看到圆柱提取后的系数解释. 源码如下: #include <pcl/ModelCoefficients.h> #include <pcl/io/pcd_io.h& ...
- Angular配置路由以及动态路由取值传值跳转
Angular配置路由 1.找到 app-routing.module.ts 配置路由 引入组件 import { HomeComponent } from './home/home.componen ...
- PS1变量设置
\d :代表日期,格式为weekday month date \H :完整的主机名 \h :主机的第一个名字 \t :显示时间为24小时格式(HH:MM:SS) \T :显示时间为12小时格式 \A ...
- ANE打包工具使用视频教程 -- 梦宇技术 @极客学院
来源:http://xtiqin.blog.163.com/blog/static/17017217920133584934827/ ANE打包工具使用视频教程 2013-04-05 08:49:34 ...
- 关于UIImageView缓存加载的笔记
加载图片的两个方法: [UIImage imageNamed:] [[UIImage alloc] initWithContentsOfFile: imgpath] [UIImage imageNam ...
- 隐藏Apache版本号及版本敏感信息
在安装软件前,我们需要隐藏软件的版本号及版本其他信息,这样就大大提高了安全指数. 只隐藏版本号: 我们在主配置文件里:httpd.conf [root@bqh- ~]# curl -i bbs.bqh ...
- 浅谈 form 表单提交
原创文章,转载请注明出处:http://www.cnblogs.com/weix-l/p/7675230.html 若有错误,请评论指出,谢谢! Form 对象代表一个 HTML 表单.在 HTML ...
- @JsonIgnore注解
注解名称:@JsonIgnore 作用:在实体类向前台返回数据时用来忽略不想传递给前台的属性或接口. Eg:User实体中会有字段password字段,当返回用户信息给前台的时候,当然是不希望将pas ...
- LB_Keogh
LB_Keogh LB_Keogh 是Keogh设计的下界函数,相比于LB_Kim以及LB_Yi具有更好的效果. 公式 注释: 上面公式中的 u 和 l 指的是上下包络线 对公式解释一下,其实就是,首 ...
- Apache的虚拟主机
一.虚拟主机的分类 基于IP的虚拟主机:一台服务器,多个ip,搭建多个网站 基于端口的虚拟主机:一台服务器,一个ip,利用不同端口,搭建多个网站 基于域名的虚拟主机:一台服务器,一个ip,多个域名,搭 ...