Java多线程编程ITeye - 威尼斯人

Java多线程编程ITeye

2019年03月06日15时54分41秒 | 作者: 永昌 | 标签: 线程,音讯,出产 | 浏览: 1836

mq.put("音讯来了!");                           // 出产音讯后,歇息100毫秒                           try {                               Thread.currentThread().sleep(100);                           } catch (InterruptedException e) {                               e.printStackTrace();                           }                       }                   }                                                     }, "Producer" + p).start();           }                      // 创立3个顾客           for(int s=0;s 3;s++){                              new Thread(new Runnable(){                   @Override                   public void run() {                                              while(true){                                                      mq.get();                           // 消费音讯后,歇息100毫秒                           try {                               Thread.currentThread().sleep(100);                           } catch (InterruptedException e) {                               e.printStackTrace();                           }                       }                   }                                                     }, "Consumer" + s).start();           }       }              /**       * 内部类模仿一个音讯行列,出产者和顾客就去操作这个音讯行列       */       private static class MessageQueue{                      private String[] messages;// 放置音讯的数据结构           private int opIndex; // 即将操作的方位索引           public MessageQueue(int size) {                              if(size  = 0){                                      throw new IllegalArgumentException("音讯行列的长度至少为1!");               }               messages = new String[size];               opIndex = 0;           }                      public synchronized void put(String message){                              // Java中存在线程假醒的状况,此处用while而不是用if!能够参阅Java标准!               while(opIndex  messages.length){                                      // 音讯行列已满,出产者需求等候                   try {                       wait();                   } catch (InterruptedException e) {                       e.printStackTrace();                   }               }               messages[opIndex] = message;               opIndex++;               System.out.println("出产者 " + Thread.currentThread().getName() + " 出产了一条音讯: " + message);               // 出产后,对顾客进行唤醒               notifyAll();           }                      public synchronized String get(){                              // Java中存在线程假醒的状况,此处用while而不是用if!能够参阅Java标准!   //假如不必while,那么当线程被唤醒的时分,就会持续履行后边的代码了,可是其实在这个时分, //仍是满意condition条件的,线程却不会再履行wait了,这样就不能到达预期的意图了。             while(opIndex  0){                                      // 音讯行列无音讯,顾客需求等候                   try {                       wait();                   } catch (InterruptedException e) {                       e.printStackTrace();                   }               }               String message = messages[opIndex-1];               opIndex;               System.out.println("顾客 " + Thread.currentThread().getName() + " 消费了一条音讯: " + message);               // 消费后,对出产者进行唤醒               notifyAll();               return message;           }                  }
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表威尼斯人立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1

    Java多线程编程ITeye

    线程,音讯,出产
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

    FileDowloadITeye

    途径,获取,绝对
  • 10

    java FTPClient的运用ITeye

    服务器,文件,运用