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

TOP

Java ʵÏÖÉú²úÕß ¨C Ïû·ÑÕßÄ£ÐÍ(ËÄ)
2017-10-27 09:06:54 ¡¾´ó ÖРС¡¿ ä¯ÀÀ:591´Î
Tags£ºJava ʵÏÖ Éú²úÕß Ïû·ÑÕß Ä£ÐÍ
} finally { BUFFER_LOCK.unlock(); } } } private class ProducerImpl extends AbstractProducer implements Producer, Runnable { @Override public void produce() throws InterruptedException { // ²»¶¨ÆÚÉú²ú£¬Ä£ÄâËæ»úµÄÓû§ÇëÇó Thread.sleep((long) (Math.random() * 1000)); BUFFER_LOCK.lockInterruptibly(); try { while (buffer.size() == cap) { BUFFER_COND.await(); } Task task = new Task(increTaskNo.getAndIncrement()); buffer.offer(task); System.out.println("produce: " + task.no); BUFFER_COND.signalAll(); } finally { BUFFER_LOCK.unlock(); } } } public static void main(String[] args) { Model model = new LockConditionModel1(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(); } } }

¸Ãд·¨µÄ˼·ÓëʵÏÖ¶þµÄ˼·ÍêÈ«Ïàͬ£¬½ö½ö½«ËøÓëÌõ¼þ±äÁ¿»»³ÉÁËLockºÍCondition¡£

ʵÏÖËÄ£º¸ü¸ß²¢·¢ÐÔÄܵÄLock && Condition

ÏÖÔÚ£¬Èç¹û×öһЩʵÑ飬Äã»á·¢ÏÖ£¬ÊµÏÖÒ»µÄ²¢·¢ÐÔÄܸßÓÚʵÏÖ¶þ¡¢Èý¡£ÔÝÇÒ²»¹ØÐÄBlockingQueueµÄ¾ßÌåʵÏÖ£¬À´·ÖÎö¿´ÈçºÎÓÅ»¯ÊµÏÖÈý£¨ÓëʵÏÖ¶þµÄ˼·Ïàͬ£¬ÐÔÄÜÏ൱£©µÄÐÔÄÜ¡£

·ÖÎöʵÏÖÈýµÄÆ¿¾±

×îºÃµÄ²éÖ¤·½·¨ÊǼǼ·½·¨Ö´ÐÐʱ¼ä£¬ÕâÑù¿ÉÒÔÖ±½Ó¶¨Î»µ½ÕæÕýµÄÆ¿¾±¡£µ«´ËÎÊÌâ½Ï¼òµ¥£¬ÎÒÃÇÖ±½ÓÓá°µÉÑÛ·¨¡±·ÖÎö¡£

ʵÏÖÈýµÄ²¢·¢Æ¿¾±ºÜÃ÷ÏÔ£¬ÒòΪÔÚËø BUFFER_LOCK ¿´À´£¬ÈκÎÏû·ÑÕßÏß³ÌÓëÉú²úÕßÏ̶߳¼ÊÇÒ»ÑùµÄ¡£»»¾ä»°Ëµ£¬Í¬Ò»Ê±¿Ì£¬×î¶àÖ»ÔÊÐíÓÐÒ»¸öỊ̈߳¨Éú²úÕß»òÏû·ÑÕߣ¬¶þÑ¡Ò»£©²Ù×÷»º³åÇø buffer¡£

¶øʵ¼ÊÉÏ£¬Èç¹û»º³åÇøÊÇÒ»¸ö¶ÓÁеĻ°£¬¡°Éú²úÕß½«²úÆ·Èë¶Ó¡±Óë¡°Ïû·ÑÕß½«²úÆ·³ö¶Ó¡±Á½¸ö²Ù×÷Ö®¼äûÓÐͬ²½¹Øϵ£¬¿ÉÒÔÔÚ¶ÓÊ׳ö¶ÓµÄͬʱ£¬ÔÚ¶ÓβÈë¶Ó¡£ÀíÏëÐÔÄÜ¿ÉÌáÉýÖÁʵÏÖÈýµÄÁ½±¶¡£

È¥µôÕâ¸öÆ¿¾±

ÄÇô˼·¾Í¼òµ¥ÁË£ºÐèÒªÁ½¸öËø CONSUME_LOCKÓëPRODUCE_LOCK£¬CONSUME_LOCK¿ØÖÆÏû·ÑÕßÏ̲߳¢·¢³ö¶Ó£¬PRODUCE_LOCK¿ØÖÆÉú²úÕßÏ̲߳¢·¢Èë¶Ó£»ÏàÓ¦ÐèÒªÁ½¸öÌõ¼þ±äÁ¿NOT_EMPTYÓëNOT_FULL£¬NOT_EMPTY¸ºÔð¿ØÖÆÏû·ÑÕßÏ̵߳Ä״̬£¨×èÈû¡¢ÔËÐУ©£¬NOT_FULL¸ºÔð¿ØÖÆÉú²úÕßÏ̵߳Ä״̬£¨×èÈû¡¢ÔËÐУ©¡£ÒÔ´ËÈÃÓÅ»¯Ïû·ÑÕßÓëÏû·ÑÕߣ¨»òÉú²úÕßÓëÉú²úÕߣ©Ö®¼äÊÇ´®Ðеģ»Ïû·ÑÕßÓëÉú²úÕßÖ®¼äÊDz¢Ðеġ£

public class LockConditionModel2 implements Model {
  private final Lock CONSUME_LOCK = new ReentrantLock();
  private final Condition NOT_EMPTY = CONSUME_LOCK.newCondition();
  private final Lock PRODUCE_LOCK = new ReentrantLock();
  private final Condition NOT_FULL = PRODUCE_LOCK.newCondition();
  private final Buffer<Task> buffer = new Buffer<>();
  private AtomicInteger bufLen = new AtomicInteger(0);
  private final int cap;
  private final AtomicInteger increTaskNo = new AtomicInteger(0);
  public LockConditionModel2(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 {
      int newBufSize = -1;
      CONSUME_LOCK.lockInterruptibly();
      try {
        while (bufLen.get() == 0) {
          System.out.println("buffer is empty...");
          NOT_EMPTY.await();
        }
        Task task = buffer.poll();
        newBufSize = bufLen.decrementAndGet();
        assert task != null;
        // ¹Ì¶¨Ê±¼ä·¶Î§µÄÏû·Ñ£¬Ä£ÄâÏà¶ÔÎȶ¨µÄ·þÎñÆ÷´¦Àí¹ý³Ì
        Thread.sleep(500 + (long) (Math.random() * 500));
        System.out.println("consume: " + task.no);
        if (newBufSize > 0) {
          NOT_EMPTY.signalAll();
        }
      } finally {
        CONSUME_LOCK.unlock();
      }
      if (newBufSize < cap) {
        PRODUCE_LOCK.lockInterruptibly();
        try {
          NOT_FULL.signalAll();
        } finally {
          PRODUCE_LOCK.unlock();
        }
      }
    }
  }
  private class ProducerImpl extends AbstractProducer implements Producer, Runnable {
    @Override
    public void produce() throws InterruptedException {
      // ²»¶¨ÆÚÉú²ú£¬Ä£ÄâËæ»úµÄÓû§ÇëÇó
      Thread.sleep((long) (Math.random() * 1000));
      int newBufSize =
Ê×Ò³ ÉÏÒ»Ò³ 1 2 3 4 5 ÏÂÒ»Ò³ βҳ 4/5/5
¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
ÉÏһƪ£º²¢·¢Ò»Ö¦»¨Ö® BlockingQueue ÏÂһƪ£ºArrayList ³õʼ»¯ ¨C Java ÄÇЩÊ..

×îÐÂÎÄÕÂ

ÈÈÃÅÎÄÕÂ

Hot ÎÄÕÂ

Python

C ÓïÑÔ

C++»ù´¡

´óÊý¾Ý»ù´¡

linux±à³Ì»ù´¡

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