ÉèΪÊ×Ò³ ¼ÓÈëÊÕ²Ø

TOP

Java ʵÏÖÉú²úÕß ¨C Ïû·ÑÕßÄ£ÐÍ(¶þ)
2017-10-27 09:06:54 ¡¾´ó ÖРС¡¿ ä¯ÀÀ:593´Î
Tags£ºJava ʵÏÖ Éú²úÕß Ïû·ÑÕß Ä£ÐÍ
produceÈÕÖ¾Ö®ºó£¬¼´£ºÍ¬Ò»ÈÎÎñµÄÏû·ÑÐÐΪһ¶¨·¢ÉúÔÚÉú²úÐÐΪ֮ºó¡£»º³åÇøµÄÈÝÁ¿Áô¸ø¶ÁÕßÑéÖ¤¡£·ûºÏÁ½¸öÑéÖ¤Ìõ¼þ¡£

BlockingQueueд·¨µÄºËÐÄÖ»ÓÐÁ½ÐдúÂ룬²¢·¢ºÍÈÝÁ¿¿ØÖƶ¼·â×°ÔÚÁËBlockingQueueÖУ¬ÕýÈ·ÐÔÓÉBlockingQueue±£Ö¤¡£ÃæÊÔÖÐÊ×Ñ¡¸Ãд·¨£¬×ÔÈ»ÃÀ¹Û¼òµ¥¡£

ʵÏÖ¶þ£ºwait && notify

Èç¹û²»Äܽ«²¢·¢ÓëÈÝÁ¿¿ØÖƶ¼·â×°ÔÚ»º³åÇøÖУ¬¾ÍÖ»ÄÜÓÉÏû·ÑÕßÓëÉú²úÕßÍê³É¡£×î¼òµ¥µÄ·½°¸ÊÇʹÓÃÆÓËصÄwait && notify»úÖÆ¡£

public class WaitNotifyModel implements Model {
  private final Object BUFFER_LOCK = new Object();
  private final Queue<Task> buffer = new LinkedList<>();
  private final int cap;
  private final AtomicInteger increTaskNo = new AtomicInteger(0);
  public WaitNotifyModel(int cap) {
    this.cap = cap;
  }
  @Override
  public Runnable newRunnableConsumer() {
    return new ConsumerImpl();
  }
  @Override
  public Runnable newRunnableProducer() {
    return new ProducerImpl();
  }
  private class ConsumerImpl extends AbstractConsumer implements Consumer, Runnable {
    @Override
    public void consume() throws InterruptedException {
      synchronized (BUFFER_LOCK) {
        while (buffer.size() == 0) {
          BUFFER_LOCK.wait();
        }
        Task task = buffer.poll();
        assert task != null;
        // ¹Ì¶¨Ê±¼ä·¶Î§µÄÏû·Ñ£¬Ä£ÄâÏà¶ÔÎȶ¨µÄ·þÎñÆ÷´¦Àí¹ý³Ì
        Thread.sleep(500 + (long) (Math.random() * 500));
        System.out.println("consume: " + task.no);
        BUFFER_LOCK.notifyAll();
      }
    }
  }
  private class ProducerImpl extends AbstractProducer implements Producer, Runnable {
    @Override
    public void produce() throws InterruptedException {
      // ²»¶¨ÆÚÉú²ú£¬Ä£ÄâËæ»úµÄÓû§ÇëÇó
      Thread.sleep((long) (Math.random() * 1000));
      synchronized (BUFFER_LOCK) {
        while (buffer.size() == cap) {
          BUFFER_LOCK.wait();
        }
        Task task = new Task(increTaskNo.getAndIncrement());
        buffer.offer(task);
        System.out.println("produce: " + task.no);
        BUFFER_LOCK.notifyAll();
      }
    }
  }
  public static void main(String[] args) {
    Model model = new WaitNotifyModel(3);
    for (int i = 0; i < 2; i++) {
      new Thread(model.newRunnableConsumer()).start();
    }
    for (int i = 0; i < 5; i++) {
      new Thread(model.newRunnableProducer()).start();
    }
  }
}

ÑéÖ¤·½·¨Í¬ÉÏ¡£

ÆÓËصÄwait && notify»úÖƲ»ÄÇôÁé»î£¬µ«×ã¹»¼òµ¥¡£synchronized¡¢wait¡¢notifyAllµÄÓ÷¨¿É²Î¿¼¡¾Java²¢·¢±à³Ì¡¿Ö®Ê®£ºÊ¹ÓÃwait/notify/notifyAllʵÏÖÏ̼߳äͨÐŵļ¸µãÖØҪ˵Ã÷£¬×ÅÖØÀí½â»½ÐÑÓëËø¾ºÕùµÄÇø±ð¡£

ʵÏÖÈý£º¼òµ¥µÄLock && Condition

ÎÒÃÇÒª±£Ö¤Àí½âwait && notify»úÖÆ¡£ÊµÏÖʱ¿ÉÒÔʹÓÃObjectÀàÌṩµÄwait()·½·¨ÓënotifyAll()·½·¨£¬µ«¸üÍƼöµÄ·½Ê½ÊÇʹÓÃjava.util.concurrent°üÌṩµÄLock && Condition¡£

public class LockConditionModel1 implements Model {
  private final Lock BUFFER_LOCK = new ReentrantLock();
  private final Condition BUFFER_COND = BUFFER_LOCK.newCondition();
  private final Queue<Task> buffer = new LinkedList<>();
  private final int cap;
  private final AtomicInteger increTaskNo = new AtomicInteger(0);
  public LockConditionModel1(int cap) {
    this.cap = cap;
  }
  @Override
  public Runnable newRunnableConsumer() {
    return new ConsumerImpl();
  }
  @Override
  public Runnable newRunnableProducer() {
    return new ProducerImpl();
  }
  private class ConsumerImpl extends AbstractConsumer implements Consumer, Runnable {
    @Override
    public void consume() throws InterruptedException {
      BUFFER_LOCK.lockInterruptibly();
      try {
        while (buffer.size() == 0) {
          BUFFER_COND.await();
        }
        Task task = buffer.poll();
        assert task != null;
        // ¹Ì¶¨Ê±¼ä·¶Î§µÄÏû·Ñ£¬Ä£ÄâÏà¶ÔÎȶ¨µÄ·þÎñÆ÷´¦Àí¹ý³Ì
        Thread.sleep(500 + (long) (Math.random() * 500));
        System.out.println("consume: " + task.no);
        BUFFER_COND.signalAll();
Ê×Ò³ ÉÏÒ»Ò³ 1 2 3 4 5 ÏÂÒ»Ò³ βҳ 2/5/5
¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
ÉÏһƪ£º²¢·¢Ò»Ö¦»¨Ö® BlockingQueue ÏÂһƪ£ºArrayList ³õʼ»¯ ¨C Java ÄÇЩÊ..

×îÐÂÎÄÕÂ

ÈÈÃÅÎÄÕÂ

Hot ÎÄÕÂ

Python

C ÓïÑÔ

C++»ù´¡

´óÊý¾Ý»ù´¡

linux±à³Ì»ù´¡

C/C++ÃæÊÔÌâÄ¿