异步简单例子

来源:互联网 发布:淘宝网被冻结怎么办 编辑:程序博客网 时间:2024/06/05 10:31

 异步执行 数据,在现实中很有用,比如点击浏览,数据量大,是否是先提供部分返回,然后交给程序去自动执行呢?这样是不是会有好很多,后台源源不断的插入数据库,前台用户往下翻的时候,自然有数据。当然还有发邮件,发消息等,交给后台去做会好很多。这里简单写个例子。


 
public class InductionService {  

        //线程池  具体想了解去看下 //http://download.oracle.com/technetwork/java/javase/6/docs/zh/api/java/util/concurrent/ExecutorService.html
       private static  ExecutorService pool = Executors.newFixedThreadPool(10);

         //内部类 实现 Runnable 接口
        class SendNewSystemMessage implements Runnable {
           

            // 普通DO
            private IpsDO ipsDO;
            public SendNewSystemMessage(IpsDO ipsD0) {
                this.ipsDO = ipsD0;
            }
         

         @Override
            public void run() {
                //TODO something to operation  work

               //这里是随机找一个  等待 ,以便后面TEST 可以真实反映 这个是异步的操作,继续往下看就能明白
                if(ipsDO.getNum()==2){
                     try {
                         System.out.println("wait......");
                        this.wait(5);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    
                }
                System.out.println("run is end...."+ipsDO.getName());
            }
            
        }
      
        public boolean getInsertIps( IpsDO ipsDO){

             //线程池submit 方法
             pool.submit(new SendNewSystemMessage(ipsDO));    
            return true;
        }
       

//测试, 少量数据,根据JAVA 执行顺序,你会发现,调用 getInsertIps 方法时, is quick 有机会比cccccccc is  要先返回,它不管里面执行是否完成直接返回, 这就是异步的魅力
        public static void main(String args[]){
            
            for(int i=0;i<10;i++){
                InductionService ic= new InductionService();
                for(int a=0;a<5;a++){
                     IpsDO ipsDO  = new  IpsDO();
                     ipsDO.setName("num"+a       +"cccccccc is  ----"+a);
                     ipsDO.setNum(a);
                    System.out.println(ic.getInsertIps(ipsDO)+"  is quick "+a);
                }
                  
            }
        }
        
}

现在直接给出 测试结果 如下:

true  is quick 0
run is end....num0cccccccc is  ----0
true  is quick 1
true  is quick 2
run is end....num1cccccccc is  ----1
true  is quick 3
true  is quick 4
run is end....num4cccccccc is  ----4
true  is quick 0
run is end....num0cccccccc is  ----0
wait......
true  is quick 1
run is end....num3cccccccc is  ----3
run is end....num1cccccccc is  ----1
true  is quick 2
wait......
true  is quick 3
run is end....num3cccccccc is  ----3
true  is quick 4
run is end....num4cccccccc is  ----4
true  is quick 0
run is end....num0cccccccc is  ----0
true  is quick 1
run is end....num1cccccccc is  ----1
true  is quick 2
wait......
true  is quick 3
run is end....num3cccccccc is  ----3
true  is quick 4
run is end....num4cccccccc is  ----4
run is end....num0cccccccc is  ----0
true  is quick 0
true  is quick 1
run is end....num1cccccccc is  ----1
wait......
true  is quick 2
true  is quick 3
run is end....num3cccccccc is  ----3
true  is quick 4
run is end....num4cccccccc is  ----4
true  is quick 0
run is end....num0cccccccc is  ----0
true  is quick 1
run is end....num1cccccccc is  ----1
true  is quick 2
wait......
true  is quick 3
run is end....num3cccccccc is  ----3
run is end....num4cccccccc is  ----4
true  is quick 4
true  is quick 0
run is end....num0cccccccc is  ----0
run is end....num1cccccccc is  ----1
true  is quick 1
true  is quick 2
wait......
run is end....num3cccccccc is  ----3
true  is quick 3
true  is quick 4
run is end....num4cccccccc is  ----4
true  is quick 0
run is end....num0cccccccc is  ----0
true  is quick 1
run is end....num1cccccccc is  ----1
wait......
true  is quick 2
true  is quick 3
run is end....num3cccccccc is  ----3
run is end....num4cccccccc is  ----4
true  is quick 4
true  is quick 0
run is end....num0cccccccc is  ----0
run is end....num1cccccccc is  ----1
true  is quick 1
true  is quick 2
true  is quick 3
true  is quick 4
true  is quick 0
true  is quick 1
true  is quick 2
true  is quick 3
true  is quick 4
true  is quick 0
true  is quick 1
true  is quick 2
true  is quick 3
true  is quick 4
wait......
run is end....num3cccccccc is  ----3
run is end....num0cccccccc is  ----0
run is end....num1cccccccc is  ----1
wait......
run is end....num3cccccccc is  ----3
run is end....num4cccccccc is  ----4
wait......
run is end....num4cccccccc is  ----4
run is end....num4cccccccc is  ----4
run is end....num3cccccccc is  ----3
run is end....num1cccccccc is  ----1
run is end....num0cccccccc is  ----0

由于执行

pool.submit(new SendNewSystemMessage(ipsDO));   
 方法里面没啥浪费时间的方法,因此有时候会不是那么明显 ,如果业务稍稍复杂点,这个就变得无限明显。

  好吧,第一次博客之旅 到此结束。 接受各种砖块。









0 0
原创粉丝点击