随笔 - 836  文章 - 1 评论 - 40 阅读 - 102万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

入门:

 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

 

posted on   lshan  阅读(367)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示