关闭

消费者生产模式

标签: 线程
69人阅读 评论(0) 收藏 举报
分类:

学JAVA的时候一直对线程这个地方没有理解很,最近再把理论复习了一遍,写了下经典问题,做个记录

此处线程用了两种方式创建线程,基本方法和线程池

synchronized关键字的一些说明:一个同步方法在执行之前需要加锁。具体一些就是,在调用一个对象的同步实例方法要求给对象加锁,调用一个类的同步静态方法要求对该类加锁。

此外,在JAVA5中,锁和条件为新内容,Lock,Condition,await(), signal()的配合使用,可以替换synchrozied是线程安全



import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

//程序使用内部类嵌套
public class ConsumerProducer {

private static Buffer buffer = new Buffer();//创建仓库

public static void main(String[] args) {

/* 基本线程初始化
* Runnable r1 = new ProduceTask();
Runnable r2 = new ConsumeTask();

Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);

t1.start();
t2.start();*/

//使用创建线程池
ExecutorService executor = Executors.newFixedThreadPool(2);
executor.execute(new ProduceTask());
executor.execute(new ConsumeTask());
}

//生产行为
private static class ProduceTask implements Runnable{
public void run() {
while(true){
int produce_num = (int)(Math.random() * 10);
System.out.println("生产:" + produce_num);
buffer.prodeuce(produce_num);
try {
Thread.sleep((int)(Math.random() * 10000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

//消费行为
private static class ConsumeTask implements Runnable{
public void run() {
while(true){
int consume_num = (int)(Math.random() * 10);
System.out.println("消费:" + consume_num);
buffer.consume(consume_num);
try {
Thread.sleep((int)(Math.random() * 10000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

//仓库
private static class Buffer{
private static final int CAPACITY = 100;
private int Current_Num = 0;

//生产
public synchronized void prodeuce(int value){
while(Current_Num + value > CAPACITY){
System.out.println("容量已到达上限,请等待。。。。");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Current_Num += value;
System.out.println("当前容量为:" + Current_Num);
notifyAll();
}

//消费
public synchronized void consume(int value){
while(Current_Num - value < 0){
System.out.println("容量即将为0,请等待。。。。");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Current_Num -= value;
System.out.println("当前容量为:" + Current_Num);
notifyAll();
}
}
}












0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:170次
    • 积分:12
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档