首页 > 学院 > 开发设计 > 正文

利用Condition实现生产者和消费者资源共享

2019-11-08 03:09:31
字体:
来源:转载
供稿:网友

啥都不说,直接上代码。

公共资源:

import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 公共资源,包含消费和生产两个方法 */public class Basket {    PRivate Lock lock;    private Condition produced;    private Condition consumed;    private int num;    public Basket(){        lock = new ReentrantLock();        produced = lock.newCondition();        consumed = lock.newCondition();    }    public void produce() throws InterruptedException {        lock.lock();        System.out.println("Producer get a lock...");        try {            while(num==1){                System.out.println("Producer sleep...");                consumed.await();                System.out.println("Producer awake...");            }            Thread.sleep(1000);            System.out.println("Producer produce an apple");            num = 1;            produced.signal();        } finally {            lock.unlock();        }    }    public void consume() throws InterruptedException {        lock.lock();        System.out.println("Consumer get a lock...");        try {            while(num == 0){                System.out.println("Consumer sleep...");                produced.await();                System.out.println("Consumer awake...");            }            Thread.sleep(500);            System.out.println("Consumer consume an apple");            num = 0;            consumed.signal();        } finally {            lock.unlock();        }    }}

生产者:

public class Producer implements Runnable {    private Basket basket;    public Producer(Basket basket){        this.basket = basket;    }    @Override    public void run() {        try {            basket.produce();        } catch (InterruptedException e) {            e.printStackTrace();        }    }}消费者:

public class Consumer implements Runnable {    private Basket basket;    public Consumer(Basket basket){        this.basket = basket;    }    @Override    public void run() {        try {            basket.consume();        } catch (InterruptedException e) {            e.printStackTrace();        }    }}测试代码:

public class BaskerTest {    private static int corePoolSize = 4;    private static int maximumPoolSize = 20;    private static long keepAlive = 100;    public static void main(String[] args) {        Basket basket = new Basket();        ExecutorService service = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAlive, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(20));        //ExecutorService service = Executors.newCachedThreadPool();        for(int i=0;i<3;i++){            service.submit(new Producer(basket));        }        for(int i=0; i<3; i++){            service.submit(new Consumer(basket));        }        service.shutdown();    }}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表