啥都不说,直接上代码。
公共资源:
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(); }}
新闻热点
疑难解答