Java多线程之生产者消费者
生产者和消费者的实例:
商品类:
/**
* 商品类
*
*/
public class Goods {
final int MAX_NUMBER = 30; // 最大数量
final int MIN_NUMBER = 0; // 最小数量
private int number;
public Goods(int number) {
super();
this.number = number;
}
public synchronized int getNumber() {
return number;
}
// 添加
public void addNumber() throws InterruptedException{
if(number >= MAX_NUMBER){
wait();
}
synchronized(this){ // 同步代码块
this.number = number + 1;
System.out.println("生产者生产商品,商品数为:" + number);
}
notifyAll();
}
// 减少
public void sumNumber() throws InterruptedException{
if(number <= MIN_NUMBER){
wait();
}
synchronized(this){
this.number = number - 1;
System.out.println("消费者消费商品,商品数为:" + number);
}
notifyAll();
}
}
测试类:
package book_14.synch;
public class Test {
public static void main(String[] args) {
// 创建对象
Goods good = new Goods(20); // 开始的商品数量设为20
while(true){
// 生产者
Runnable r1 = () ->{
try {
while(true){
good.addNumber();
//Thread.sleep(10);
}
} catch (Exception e) {
// TODO: handle exception
}
};
Thread t1 = new Thread(r1);
t1.start();
// 消费者
Runnable r2 = () ->{
try {
while(true){
good.sumNumber();
//Thread.sleep(10);
}
} catch (Exception e) {
// TODO: handle exception
}
};
Thread t2 = new Thread(r2);
t2.start();
}
}
}
最新文章
- 图解JVM的Class文件格式(详细版)
- gcd和ex_gcd
- div使用jqueryui 源码 | gridview多个功能的源码
- 史上最全Vim快捷键键位图(入门到进阶)
- ***Jquery下Ajax与PHP数据交换
- Oracle 动态查询,EXECUTE IMMEDIATE select into使用方法
- SQL参数化查询的问题
- matab plot指令和低通滤波器的响应图
- block循环饮用解决
- Unity 用ml-agents机器学习造个游戏AI吧(2)(入门DEMO)
- DAS、SAN和NAS三种存储方式
- Redis操作集合,有序集合
- CI框架在模型中切换读写库和读写库
- windows 性能监视器常用计数器
- rocketmq连接报connect to ip:10909 failed
- 学习使用NotePad++
- IIS7根据PID查找对应的站点
- 核心API的使用(获取两个字符串的最大相同子串)
- RabbitMQ---2、介绍
- 【JavaScript】BOM