• FutureTask demo springboot


    入门:

     public class MutilThreadTest {

    /**
         * 方式一:callable  有返回值
         * @param bb
         * @return
         * @throws Exception
         */
    //    @Async
         public Callable<String>  testCallable1(String bb) throws Exception{
             
             Callable<String>  result=  new Callable<String>() {
    
                @Override
                public String call() throws Exception {
                    
                    System.err.println("线程一启动了");
                    
                    System.err.println("线程一启动了");
                    
                    System.err.println("线程一启动了");
                    Thread.sleep(4000);
                    return bb;
                }};
             
                
                return result;
         }
        
         
    //@Async     
    public Callable<String>  testCallable2(String aa) throws Exception{
             
             Callable<String>  result=  new Callable<String>() {
    
                @Override
                public String call() throws Exception {
                    
                    Thread.sleep(5000);
                    System.err.println("线程2启动了");
                    System.err.println("线程2启动了");
                    System.err.println("线程2启动了");
                    return aa;
                }};
             
                
                return result;
         }
         
    
    
    @Test
    //public FutureTask<String> testFutureTask() throws Exception {
        public void testFutureTask() throws Exception {
        
        long start = System.currentTimeMillis();
    //    Thread.sleep(3000);
        FutureTask<String> futureTask1 = new FutureTask<String>(testCallable1("xain11111"));// 将Callable写的任务封装到一个由执行者调度的FutureTask对象  
        FutureTask<String> futureTask2 = new FutureTask<String>(testCallable2("xain2222"));  
    
        ExecutorService executor = Executors.newFixedThreadPool(2);        // 创建线程池并返回ExecutorService实例  
        executor.execute(futureTask1);  // 执行任务  
        executor.execute(futureTask2);
        System.err.println("total cost time is :" +(System.currentTimeMillis()-start));
    //    System.err.println(futureTask1.get());
    //    System.err.println(futureTask2.get());
    //    boolean done = futureTask1.isDone();
    //    boolean done1 = futureTask2.isDone();
    //    System.err.println(done);
    //    System.err.println(done1);
    //    executor.shutdown();                          // 关闭线程池和服务   
    //    Thread.currentThread().join();
    //    return;
        
      while (true) {//等待所有任务都执行结束
            boolean done = futureTask1.isDone();
            boolean done1 = futureTask2.isDone();
            if(done&&done1){
                System.err.println("total cost time is11 :" +(System.currentTimeMillis()-start));
                System.err.println(futureTask1.get());
                System.err.println(futureTask2.get());
                break;
                }
            }
        
    }
    }

    配置线程池:

    @Configuration
    public class ThreadPoolConfig {
    
        
        @Bean
        @Qualifier("executorServicePro")
        public ExecutorService executorServicePro(){
            
            return Executors.newFixedThreadPool(20);
        }
    }

    test: 例子

    @Autowired
    @Qualifier("executorServicePro")
    private  ExecutorService executorServicePro;
    
    
    public FutureTask<String> getDataAsync(String word ,long millis,ExecutorService executor){
         Callable<String> callable = new Callable<String>() {
            @Override
            public String call() throws Exception {
                long start = System.currentTimeMillis();
                logger.info("start query data ");
                Thread.sleep(millis);
                logger.info("end query data from db and total cost time is {}",(System.currentTimeMillis()-start));
                return word;
            }
        };
        FutureTask<String> futureTask = new FutureTask<String>(callable);
        executorServicePro.execute(futureTask); ////    executor.submit(futureTask);
        return futureTask;
    
    }
    
    @Test
    public void testNameqq() throws Exception {
        
         ExecutorService executor = Executors.newFixedThreadPool(2);
        long start = System.currentTimeMillis();
            logger.info("zhu xian cheng start ");
            
            
            FutureTask<String> dataAsync1 = getDataAsync("X1111",2000l,executor);
            FutureTask<String> dataAsync2 = getDataAsync("X1111",6000l,executor);
            FutureTask<String> dataAsync3 = getDataAsync("X1111",2000l,executor);
            FutureTask<String> dataAsync4 = getDataAsync("X1111",1000l,executor);
    //        executor.execute(dataAsync1);
    //        executor.execute(dataAsync2);
    //        executor.execute(dataAsync3);
    //        executor.execute(dataAsync4);
            //此处一定要全部得到后,然后在get() ,否则线程串行,时间累加
            dataAsync1.get();
            dataAsync2.get();
            dataAsync3.get();
            dataAsync4.get();
            logger.info("main  total cost time is {}",(System.currentTimeMillis()-start));
            logger.info("zhu xian cheng  end ");
    }

    结果:

      

    2019-05-17 18:34:38.408 INFO 20768 --- [ main] com.icil.report.MutilThreadTest2 : zhu xian cheng start
    2019-05-17 18:34:38.409 INFO 20768 --- [pool-1-thread-1] com.icil.report.MutilThreadTest2 : start query data from db and jdbc is {}
    2019-05-17 18:34:38.409 INFO 20768 --- [pool-1-thread-2] com.icil.report.MutilThreadTest2 : start query data from db and jdbc is {}
    2019-05-17 18:34:38.410 INFO 20768 --- [pool-1-thread-3] com.icil.report.MutilThreadTest2 : start query data from db and jdbc is {}
    2019-05-17 18:34:38.410 INFO 20768 --- [pool-1-thread-4] com.icil.report.MutilThreadTest2 : start query data from db and jdbc is {}
    2019-05-17 18:34:39.410 INFO 20768 --- [pool-1-thread-4] com.icil.report.MutilThreadTest2 : end query data from db and total cost time is 1000
    2019-05-17 18:34:40.409 INFO 20768 --- [pool-1-thread-1] com.icil.report.MutilThreadTest2 : end query data from db and total cost time is 2000
    2019-05-17 18:34:40.410 INFO 20768 --- [pool-1-thread-3] com.icil.report.MutilThreadTest2 : end query data from db and total cost time is 2000
    2019-05-17 18:34:44.410 INFO 20768 --- [pool-1-thread-2] com.icil.report.MutilThreadTest2 : end query data from db and total cost time is 6001
    2019-05-17 18:34:44.410 INFO 20768 --- [ main] com.icil.report.MutilThreadTest2 : main total cost time is 6002
    2019-05-17 18:34:44.410 INFO 20768 --- [ main] com.icil.report.MutilThreadTest2 : zhu xian cheng end

  • 相关阅读:
    listview 加载性能优化 viewholder
    eclipse使用有感
    android常见的错误
    填充父窗体布局问题
    setTag()/getTag()
    自己动手实现自旋锁
    新手学信息检索6:谈谈二值独立模型
    自己动手编译、运行Java程序
    新手学信息检索5:正确率召回率与搜索引擎的评价
    新手学信息检索4:向量空间模型与相似度计算
  • 原文地址:https://www.cnblogs.com/lshan/p/10880862.html
Copyright © 2020-2023  润新知