阻塞队列入门2

来源:互联网 发布:node v7.0.0 x64.msi 编辑:程序博客网 时间:2024/06/01 10:08

1.一个例子

  • 用两个具有1个空间的队列来实现同步通知的功能
    • 两个线程,你一下我一下,你来我往
    • 以前写过一个类似的
    • 用阻塞队列来实现这个功能

2.分析

这里写图片描述

3.实例

 public class BlockingQueueCommunication {                public static void main(String[] args) {                    Business business = new Business();                    new Thread(new Runnable() {                        @Override                        public void run() {                            for(int i=1;i<=50;i++) {                                  business.sub(i);                            }                        }                    }).start();                    for(int i=1;i<=50;i++) {                           business.main(i);                    }                }             static class Business{                       BlockingQueue<Integer> queue1 = new ArrayBlockingQueue<Integer>(1);                       BlockingQueue<Integer> queue2 = new ArrayBlockingQueue<Integer>(1);                       {//匿名构造方法,对象创建几次就调用几次                                                  try {                            queue2.put(1);                        } catch (InterruptedException e) {                            // TODO Auto-generated catch block                            e.printStackTrace();                        }                       }                       public void sub(int i) {                           try {                            queue1.put(1);                        } catch (InterruptedException e) {                            // TODO Auto-generated catch block                            e.printStackTrace();                        }                           for(int j=1;j<=10;j++) {                                System.out.println("sub thread sequece of "+j+",loop of "+i);                            }                            try {                                queue2.take();                            } catch (InterruptedException e) {                                // TODO Auto-generated catch block                                e.printStackTrace();                            }                       }                       public void main(int i) {                            try {                                queue2.put(1);                            } catch (InterruptedException e1) {                                // TODO Auto-generated catch block                                e1.printStackTrace();                            }                           for(int j=1;j<=100;j++) {                                System.out.println("main thread sequece of "+j+",loop of "+i);                            }                            try {                                queue1.take();                            } catch (InterruptedException e) {                                // TODO Auto-generated catch block                                e.printStackTrace();                            }                       }                }}
  • 为什么用匿名构造方法,而不用静态代码块?
    • 用静态代码块是不能创建对象的
    • 静态代码块是运行类加载之后运行一次
    • 而匿名构造方法运行是在所有的构造方法之前
原创粉丝点击