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

TOP

Java ʵÏÖÉú²úÕß ¨C Ïû·ÑÕßÄ£ÐÍ(Ò»)
2017-10-27 09:06:54 ¡¾´ó ÖРС¡¿ ä¯ÀÀ:589´Î
Tags£ºJava ʵÏÖ Éú²úÕß Ïû·ÑÕß Ä£ÐÍ

¿¼²éJavaµÄ²¢·¢±à³Ìʱ£¬ÊÖд¡°Éú²úÕß-Ïû·ÑÕßÄ£ÐÍ¡±ÊÇÒ»¸ö¾­µäÎÊÌâ¡£ÓÐÈçϼ¸¸ö¿¼µã£º

  • ¶ÔJava²¢·¢Ä£Ð͵ÄÀí½â
  • ¶ÔJava²¢·¢±à³Ì½Ó¿ÚµÄÊìÁ·³Ì¶È
  • bug free
  • coding style

±¾ÎÄÖ÷Òª¹éÄÉÁË4ÖÖд·¨£¬ÔĶÁºó£¬×îºÃÔÚ°×°åÉÏÁ·Ï°¼¸±é£¬¼ì²é×Ô¼ºÊÇ·ñÕÆÎÕ¡£Õâ4ÖÖд·¨»òÕß±à³Ì½Ó¿Ú²»Í¬£¬»òÕß²¢·¢Á£¶È²»Í¬£¬µ«±¾ÖÊÊÇÏàͬµÄ¡ª¡ª¶¼ÊÇÔÚʹÓûòʵÏÖBlockingQueue¡£

Éú²úÕß-Ïû·ÑÕßÄ£ÐÍ

ÍøÉÏÓкܶàÉú²úÕß-Ïû·ÑÕßÄ£Ð͵Ķ¨ÒåºÍʵÏÖ¡£±¾ÎÄÑо¿×î³£ÓõÄÓнçÉú²úÕß-Ïû·ÑÕßÄ£ÐÍ£¬¼òµ¥¸ÅÀ¨ÈçÏ£º

  • Éú²úÕß³ÖÐøÉú²ú£¬Ö±µ½»º³åÇøÂú£¬×èÈû£»»º³åÇø²»Âúºó£¬¼ÌÐøÉú²ú
  • Ïû·ÑÕß³ÖÐøÏû·Ñ£¬Ö±µ½»º³åÇø¿Õ£¬×èÈû£»»º³åÇø²»¿Õºó£¬¼ÌÐøÏû·Ñ
  • Éú²úÕß¿ÉÒÔÓжà¸ö£¬Ïû·ÑÕßÒ²¿ÉÒÔÓжà¸ö

¿Éͨ¹ýÈçÏÂÌõ¼þÑé֤ģÐÍʵÏÖµÄÕýÈ·ÐÔ£º

  • ͬһ²úÆ·µÄÏû·ÑÐÐΪһ¶¨·¢ÉúÔÚÉú²úÐÐΪ֮ºó
  • ÈÎÒâʱ¿Ì£¬»º³åÇø´óС²»Ð¡ÓÚ0£¬²»´óÓÚÏÞÖÆÈÝÁ¿

¸ÃÄ£Ð͵ÄÓ¦ÓúͱäÖַdz£¶à£¬²»×¸Êö¡£

¼¸ÖÖд·¨

×¼±¸

ÃæÊÔʱ¿ÉÓïÑÔ˵Ã÷ÒÔÏÂ×¼±¸´úÂë¡£¹Ø¼ü²¿·ÖÐèҪʵÏÖ£¬ÈçAbstractConsumer¡£

ÏÂÃæ»áÉæ¼°¶àÖÖÉú²úÕß-Ïû·ÑÕßÄ£Ð͵ÄʵÏÖ£¬¿ÉÒÔÏȳéÏó³ö¹Ø¼üµÄ½Ó¿Ú£¬²¢ÊµÏÖһЩ³éÏóÀࣺ

public interface Consumer {
  void consume() throws InterruptedException;
}
public interface Producer {
  void produce() throws InterruptedException;
}
abstract class AbstractConsumer implements Consumer, Runnable {
  @Override
  public void run() {
    while (true) {
      try {
        consume();
      } catch (InterruptedException e) {
        e.printStackTrace();
        break;
      }
    }
  }
}
abstract class AbstractProducer implements Producer, Runnable {
  @Override
  public void run() {
    while (true) {
      try {
        produce();
      } catch (InterruptedException e) {
        e.printStackTrace();
        break;
      }
    }
  }
}

²»Í¬µÄÄ£ÐÍʵÏÖÖУ¬Éú²úÕß¡¢Ïû·ÑÕߵľßÌåʵÏÖÒ²²»Í¬£¬ËùÒÔÐèҪΪģÐͶ¨Òå³éÏ󹤳§·½·¨£º

public interface Model {
  Runnable newRunnableConsumer();
  Runnable newRunnableProducer();
}

ÎÒÃǽ«Task×÷ΪÉú²úºÍÏû·ÑµÄµ¥Î»£º

public class Task {
  public int no;
  public Task(int no) {
    this.no = no;
  }
}

Èç¹ûÐèÇó»¹²»Ã÷È·£¨Õâ·ûºÏ´ó²¿·Ö¹¤³Ì¹¤×÷µÄʵ¼ÊÇé¿ö£©£¬½¨Òé±ßʵÏֱ߳éÏ󣬲»Òª¡°ÃæÏòδÀ´±à³Ì¡±¡£

ʵÏÖÒ»£ºBlockingQueue

BlockingQueueµÄд·¨×î¼òµ¥¡£ºËÐÄ˼ÏëÊÇ£¬°Ñ²¢·¢ºÍÈÝÁ¿¿ØÖÆ·â×°ÔÚ»º³åÇøÖС£¶øBlockingQueueµÄÐÔÖÊÌìÉúÂú×ãÕâ¸öÒªÇó¡£

public class BlockingQueueModel implements Model {
  private final BlockingQueue<Task> queue;
  private final AtomicInteger increTaskNo = new AtomicInteger(0);
  public BlockingQueueModel(int cap) {
    // LinkedBlockingQueue µÄ¶ÓÁÐÊÇ lazy-init µÄ£¬µ« ArrayBlockingQueue ÔÚ´´½¨Ê±¾ÍÒѾ­ init
    this.queue = new LinkedBlockingQueue<>(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 {
      Task task = queue.take();
      // ¹Ì¶¨Ê±¼ä·¶Î§µÄÏû·Ñ£¬Ä£ÄâÏà¶ÔÎȶ¨µÄ·þÎñÆ÷´¦Àí¹ý³Ì
      Thread.sleep(500 + (long) (Math.random() * 500));
      System.out.println("consume: " + task.no);
    }
  }
  private class ProducerImpl extends AbstractProducer implements Producer, Runnable {
    @Override
    public void produce() throws InterruptedException {
      // ²»¶¨ÆÚÉú²ú£¬Ä£ÄâËæ»úµÄÓû§ÇëÇó
      Thread.sleep((long) (Math.random() * 1000));
      Task task = new Task(increTaskNo.getAndIncrement());
      queue.put(task);
      System.out.println("produce: " + task.no);
    }
  }
  public static void main(String[] args) {
    Model model = new BlockingQueueModel(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();
    }
  }
}

½ØÈ¡Ç°ÃæµÄÒ»²¿·ÖÊä³ö£º

produce: 0
produce: 4
produce: 2
produce: 3
produce: 5
consume: 0
produce: 1
consume: 4
produce: 7
consume: 2
produce: 8
consume: 3
produce: 6
consume: 5
produce: 9
consume: 1
produce: 10
consume: 7

ÓÉÓÚ²Ù×÷¡°³ö¶Ó/Èë¶Ó+ÈÕÖ¾Êä³ö¡±²»ÊÇÔ­×ӵģ¬ËùÒÔÉÏÊöÈÕÖ¾µÄ¾ø¶Ô˳ÐòÓëʵ¼ÊµÄ³ö¶Ó/Èë¶Ó˳ÐòÓгöÈ룬µ«¶ÔÓÚͬһ¸öÈÎÎñºÅtask.no£¬ÆäconsumeÈÕÖ¾Ò»¶¨³öÏÖÔÚÆä

Ê×Ò³ ÉÏÒ»Ò³ 1 2 3 4 5 ÏÂÒ»Ò³ βҳ 1/5/5
¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
ÉÏһƪ£º²¢·¢Ò»Ö¦»¨Ö® BlockingQueue ÏÂһƪ£ºArrayList ³õʼ»¯ ¨C Java ÄÇЩÊ..

×îÐÂÎÄÕÂ

ÈÈÃÅÎÄÕÂ

Hot ÎÄÕÂ

Python

C ÓïÑÔ

C++»ù´¡

´óÊý¾Ý»ù´¡

linux±à³Ì»ù´¡

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