跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 问一个 Java 的 Condition 问题
未分類
2020 年 12 月 6 日

问一个 Java 的 Condition 问题

问一个 Java 的 Condition 问题

資深大佬 : overthemoon 2

有两个线程,一个生产者,一个消费者,不断的在队列里面插数据和取数据。 有个问题 notFull.signalAll()这句代码一个放在 try 里面,一个放在 finally 里面控制台输出结果为什么不一样?

 public class ConditionDemo2 {      private int queueSize = 10;     private PriorityQueue<Integer> queue = new PriorityQueue<Integer>(queueSize);     private Lock lock = new ReentrantLock();     private Condition notFull = lock.newCondition();     private Condition notEmpty = lock.newCondition();      public static void main(String[] args) {         ConditionDemo2 conditionDemo2 = new ConditionDemo2();         Producer producer = conditionDemo2.new Producer();         Consumer consumer = conditionDemo2.new Consumer();         producer.start();         consumer.start();     }      class Consumer extends Thread {          @Override         public void run() {             consume();         }          private void consume() {             while (true) {                 lock.lock();                 try {                     while (queue.size() == 0) {                         System.out.println("队列空,等待数据");                         try {                             notEmpty.await();                         } catch (InterruptedException e) {                             e.printStackTrace();                         }                     }                     queue.poll();                     notFull.signalAll();//看这里----------------------                     System.out.println("从队列里取走了一个数据,队列剩余" + queue.size() + "个元素");                 } finally {                     lock.unlock();                 }             }         }     }      class Producer extends Thread {          @Override         public void run() {             produce();         }          private void produce() {             while (true) {                 lock.lock();                 try {                     while (queue.size() == queueSize) {                         System.out.println("队列满,等待有空余");                         try {                             notFull.await();                         } catch (InterruptedException e) {                             e.printStackTrace();                         }                     }                     queue.offer(1);                     notEmpty.signalAll();//看这里----------------------                     System.out.println("向队列插入了一个元素,队列剩余空间" + (queueSize - queue.size()));                 } finally {                     lock.unlock();                 }             }         }     }  }   
 public class ConditionDemo3 {      private int queueSize = 10;     private PriorityQueue<Integer> queue = new PriorityQueue<Integer>(queueSize);     private Lock lock = new ReentrantLock();     private Condition notFull = lock.newCondition();     private Condition notEmpty = lock.newCondition();      public static void main(String[] args) {         ConditionDemo3 conditionDemo2 = new ConditionDemo3();         Producer producer = conditionDemo2.new Producer();         Consumer consumer = conditionDemo2.new Consumer();         producer.start();         consumer.start();     }      class Consumer extends Thread {          @Override         public void run() {             consume();         }          private void consume() {             while (true) {                 lock.lock();                 try {                     while (queue.size() == 0) {                         System.out.println("队列空,等待数据");                         try {                             notEmpty.await();                         } catch (InterruptedException e) {                             e.printStackTrace();                         }                     }                     queue.poll();                     System.out.println("从队列里取走了一个数据,队列剩余" + queue.size() + "个元素");                 } finally {                     notFull.signalAll();//看这里----------------------                     lock.unlock();                 }             }         }     }      class Producer extends Thread {          @Override         public void run() {             produce();         }          private void produce() {             while (true) {                 lock.lock();                 try {                     while (queue.size() == queueSize) {                         System.out.println("队列满,等待有空余");                         try {                             notFull.await();                         } catch (InterruptedException e) {                             e.printStackTrace();                         }                     }                     queue.offer(1);                     System.out.println("向队列插入了一个元素,队列剩余空间" + (queueSize - queue.size()));                 } finally {                     System.out.println("final");                     notFull.signalAll();//看这里----------------------                     lock.unlock();                 }             }         }     }  }   

大佬有話說 (3)

  • 主 資深大佬 : overthemoon

    此贴终结,我代码看错了==~~~~~~~~

  • 資深大佬 : bxb100

    @overthemoon #1 问一个 Java 的 Condition 问题 分享一下

  • 資深大佬 : zcsz

    @overthemoon 亏我点进来从上到下仔仔细细看了一遍,拉到 1 …………..

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具