这篇文章将使用经典的生产者消费者的例子来进一步巩固java多线程通信,介绍使用阻塞队列来简化程序下面是一个经典的生产者消费者的例子:假设使用缓冲区存储整数,缓冲区的大小是受限制的。缓冲区提供write(int)方法将一个整数添加到缓冲区,还体统read()方法从缓冲区中读取并删除 ...
这篇文章将使用经典的生产者消费者的例子来进一步巩固java多线程通信,介绍使用阻塞队列来简化程序
下面是一个经典的生产者消费者的例子:
假设使用缓冲区存储整数,缓冲区的大小是受限制的。缓冲区提供write(int)方法将一个整数添加到缓冲区,还体统read()方法从缓冲区中读取并删除一个整数。为了同步操作,使用具有两个条件的锁,notEmpty(缓冲区非空)和notFull(缓冲区未满)。当任务相缓冲区添加一个int时,如果缓冲区是满的,那么任务将等待notFull状态,当任务从缓冲区总删除一个int时,如果缓冲区是空的,那么任务将等待notEmpty状态。
import java.util.LinkedList;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock; public class ConsumerProducer { private static Buffer buffer = new Buffer(); public static void main(String[] args) { // 创建线程池 ExecutorService executor = Executors.newFixedThreadPool(2); executor.execute(new Producertask()); executor.execute(new Consumertask()); executor.shutdown(); } private static class Producertask implements Runnable { @Override public void run() { try { int i = 1; while (true) { System.out.println("Producer writes " + i); buffer.write(i++); Thread.sleep((int) (Math.random() * 10000)); } } catch (InterruptedException e) { e.printStackTrace(); } } } private static class Consumertask implements Runnable { public void run() { try { while (true) { System.out.println("\t\t\tConsumer reads " + buffer.read()); Thread.sleep((int) (Math.random() * 10000)); } } catch (InterruptedException e) { e.printStackTrace(); } } } private static class Buffer { private static final int CAPACITY = 1; // buffer size LinkedList<Integer> queue = new LinkedList<Integer>(); // 创建锁 private static Lock lock = new ReentrantLock(); // 创建两个条件 private static Condition notEmpty = lock.newCondition(); private static Condition notFull = lock.newCondition(); public void write(int value) { lock.lock(); // 请求锁 try { while (queue.size() == CAPACITY) { System.out.println("Wait for notFull condition"); notFull.await(); } queue.offer(value); notEmpty.signal(); // notEmpty条件信号 } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); // 释放锁 } } @SuppressWarnings("finally") public int read() { int value = 0; lock.lock(); try { while (queue.isEmpty()) { System.out.println("\t\t\tWait for notEmpty condition"); notEmpty.await(); } value = queue.remove(); notFull.signal(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); return value; } } }}
原标题:java多线程系列6
关键词:JAVA
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。