美文网首页
实战! 多线程线程池分析

实战! 多线程线程池分析

作者: 进击的三文鱼 | 来源:发表于2021-05-15 23:43 被阅读0次

一 项目线程池运用

ExecutorService pool = new ThreadPoolExecutor(3, 6,
        0L, TimeUnit.MILLISECONDS,
        new LinkedBlockingQueue(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());

StopWatch stopWatch=new StopWatch();
stopWatch.start();
final String notifyId=event.notifyId;
LOG.info("transaction.onNotifyBegin.notifyId:{}",notifyId);
Callable callable=new Callable() {
    @Override
    public Boolean call() {
        Transaction transaction = tradeService.findByNotifyId(notifyId);
        if(transaction==null){
            LOG.error("找不到对象,notifyId:{}",notifyId);
            return true;
        }
    }
};

Future future = pool.submit(callable);
stopWatch.stop();
LOG.info("notifyId:{}通知执行结果;{},用时:{}ms",notifyId,future.get(),stopWatch.getTotalTimeMillis());

二 线程池代码分析

ExecutorService pool = new ThreadPoolExecutor(3, 6,
        0L, TimeUnit.MILLISECONDS,
        new LinkedBlockingQueue(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());
  1. 线程池参数

    这里面的参数分别为初始线程数3,最大线程数6,线程存活时间0毫秒,使用了LinkedBlockingQueue,生产消费的阻塞队列,内部是使用ReentrantLockCondition来保证生产和消费的同步,他的长度是1024,而后面的两个参数就是指定线程池的名称,以方便问题的排查。

  2. 线程池的执行

     StopWatch stopWatch = new StopWatch();
     stopWatch.start();
     final String notifyId=event.notifyId;
     LOG.info("transaction.onNotifyBegin.notifyId:{}",notifyId);
     Callable callable=new Callable() {
         @Override
         public Boolean call() {
             Transaction transaction = tradeService.findByNotifyId(notifyId);
             if(transaction==null){
                 LOG.error("找不到对象,notifyId:{}",notifyId);
                 return true;
             }
         }
     };
     Future future = pool.submit(callable);
     stopWatch.stop();
    

    这里面使用了pool.submit(callable); 来执行线程,还有另外一个无参的执行方法excute(),那他们之间有什么区别呢,pool.submit传入Callable类最终返回Future,而Future对象就可以获得线程执行完的返回值,然后对返回值进行判断线程池中的线程是否执行成功,而excute()方法是没有返回值的,他不去关注方法的返回值信息。

  3. StopWatch类

    他与线城池无关,他其实是一个计时器类

     StopWatch stop = new StopWatch("TASK");
     stop.start("TASK");
     try {
         Thread.sleep(3000);
     } catch (InterruptedException e) {
         e.printStackTrace();
     }
     stop.stop();
     System.out.println(stop.getTotalTimeMillis());
     System.out.println(stop.prettyPrint());
    

    通过他我们可以更好的输出方法的运行时长。

相关文章

  • 实战! 多线程线程池分析

    一 项目线程池运用 二 线程池代码分析 线程池参数这里面的参数分别为初始线程数3,最大线程数6,线程存活时间0毫秒...

  • 第六章、服务器业务逻辑处理框架

    6.1、业务处理逻辑之多线程、线程池实战//(3.1)为什么引入线程池//我们完全不推荐用单线程的方式解决逻辑业务...

  • Thread

    队列 线程锁 多线程,线程池 队列 多线程爬虫示例 多线程 自定义线程 线程池

  • Java:线程池Executors.newFixedThread

    摘要:Java,多线程,线程池 多线程编程和线程池概述 (1)多线程程序: 计算机可以实现多任务 ( multit...

  • 10.3多线程详解

    Java高级-多线程 多线程创建 多线程通讯 线程池 1.多线程创建 thread/runnable图:继承Thr...

  • Springboot | 线程池的学习,多线程池配置示例

    一、线程和进程,线程的生命周期二、单线程和多线程三、线程池的概念四、线程池的使用五、多线程池配置示例 一、线程和进...

  • 反射、注解与依赖注入总结

    上一篇【线程、多线程与线程池总结】中主要记录线程、多线程相关概念,侧重于线程的Future使用与线程池的操作;同样...

  • 源码分析之ThreadPoolExecutor

    线程池在多线程编程的中可谓是个利器,使用线程池会大大提高多线程的效率。原因是使用线程池相对于new Thread有...

  • Java面试题——多线程

    Java面试题——多线程 1,什么是线程池? 线程池是多线程的一种处理方式,处理过程中将任务提交给线程池,任务执行...

  • 月薪2w以上的java程序员面试都会问的问题

    多线程相关问题 实现多线程有哪些方式?有什么异同? 线程的生命周期 线程池常用的有哪些? 线程池的工作原理 如何启...

网友评论

      本文标题:实战! 多线程线程池分析

      本文链接:https://www.haomeiwen.com/subject/nshljltx.html