wait/notifyAll实现生产者消费者模型仿真

来源:互联网 发布:25端口是什么 编辑:程序博客网 时间:2024/05/29 19:30
package webapp;import java.util.Date;import java.util.LinkedList;import java.util.List;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;public class ExploreWait {  public static void addProducer(ExecutorService exec, List<String> list) {    exec.execute(new Runnable() {      @Override      public void run() {        while (!Thread.currentThread().isInterrupted()) {          synchronized (list) {            while (list.size() == 10) {              try {                System.out.println("please wait to produce...");                list.wait();              } catch (InterruptedException e) {                e.printStackTrace();              }            }            int size = list.size();            Date d = new Date();            String rs = "produced at:[" + d + "],[size=" + (size + 1) + "]";            list.add(rs);            System.out.println(rs);            list.notifyAll();          }          Thread.yield();        }      }    });  };  public static void addConsumer(ExecutorService exec, List<String> list) {    // consumer    exec.execute(new Runnable() {      @Override      public void run() {        while (!Thread.currentThread().isInterrupted()) {          synchronized (list) {            while (list.size() == 0) {              try {                System.out.println("please wait to consume...");                list.wait();              } catch (InterruptedException e) {                e.printStackTrace();              }            }            String str = ((LinkedList<String>)list).pollFirst();            System.out.println("consumed at[" + new Date() + "],comsumed:" + str + ",current size"                + list.size());            list.notifyAll();          }          Thread.yield();        }      }    });  };  public static void main(String[] args) {    ExecutorService exec = Executors.newCachedThreadPool();    List<String> list = new LinkedList<>();    addProducer(exec, list);    addConsumer(exec, list);    addProducer(exec, list);    addConsumer(exec, list);    try {      TimeUnit.SECONDS.sleep(3);      System.exit(0);    } catch (InterruptedException e) {      e.printStackTrace();    }  }}

0 0
原创粉丝点击