实战! 多线程线程池分析

简介: 实战! 多线程线程池分析

一 项目线程池运用

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());

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

相关文章
|
2月前
|
存储 NoSQL Redis
Redis 新版本引入多线程的利弊分析
【10月更文挑战第16天】Redis 新版本引入多线程是一个具有挑战性和机遇的改变。虽然多线程带来了一些潜在的问题和挑战,但也为 Redis 提供了进一步提升性能和扩展能力的可能性。在实际应用中,我们需要根据具体的需求和场景,综合评估多线程的利弊,谨慎地选择和使用 Redis 的新版本。同时,Redis 开发者也需要不断努力,优化和完善多线程机制,以提供更加稳定、高效和可靠的 Redis 服务。
48 1
|
1月前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
105 38
|
2月前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
48 1
C++ 多线程之初识多线程
|
1月前
|
Java
线程池内部机制:线程的保活与回收策略
【10月更文挑战第24天】 线程池是现代并发编程中管理线程资源的一种高效机制。它不仅能够复用线程,减少创建和销毁线程的开销,还能有效控制并发线程的数量,提高系统资源的利用率。本文将深入探讨线程池中线程的保活和回收机制,帮助你更好地理解和使用线程池。
59 2
|
1月前
|
Prometheus 监控 Cloud Native
JAVA线程池监控以及动态调整线程池
【10月更文挑战第22天】在 Java 中,线程池的监控和动态调整是非常重要的,它可以帮助我们更好地管理系统资源,提高应用的性能和稳定性。
72 4
|
1月前
|
Prometheus 监控 Cloud Native
在 Java 中,如何使用线程池监控以及动态调整线程池?
【10月更文挑战第22天】线程池的监控和动态调整是一项重要的任务,需要我们结合具体的应用场景和需求,选择合适的方法和策略,以确保线程池始终处于最优状态,提高系统的性能和稳定性。
124 2
|
2月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
20 3
|
2月前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
19 2
|
2月前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
31 2
|
2月前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
36 1