实战! 多线程线程池分析

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

一 项目线程池运用

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

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

相关文章
|
16天前
|
存储 监控 Java
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
142 60
【Java并发】【线程池】带你从0-1入门线程池
|
2月前
|
监控 Kubernetes Java
阿里面试:5000qps访问一个500ms的接口,如何设计线程池的核心线程数、最大线程数? 需要多少台机器?
本文由40岁老架构师尼恩撰写,针对一线互联网企业的高频面试题“如何确定系统的最佳线程数”进行系统化梳理。文章详细介绍了线程池设计的三个核心步骤:理论预估、压测验证和监控调整,并结合实际案例(5000qps、500ms响应时间、4核8G机器)给出具体参数设置建议。此外,还提供了《尼恩Java面试宝典PDF》等资源,帮助读者提升技术能力,顺利通过大厂面试。关注【技术自由圈】公众号,回复“领电子书”获取更多学习资料。
|
2月前
|
并行计算 安全 Java
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
179 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
|
1月前
|
Python
python3多线程中使用线程睡眠
本文详细介绍了Python3多线程编程中使用线程睡眠的基本方法和应用场景。通过 `time.sleep()`函数,可以使线程暂停执行一段指定的时间,从而控制线程的执行节奏。通过实际示例演示了如何在多线程中使用线程睡眠来实现计数器和下载器功能。希望本文能帮助您更好地理解和应用Python多线程编程,提高程序的并发能力和执行效率。
54 20
|
1月前
|
安全 Java C#
Unity多线程使用(线程池)
在C#中使用线程池需引用`System.Threading`。创建单个线程时,务必在Unity程序停止前关闭线程(如使用`Thread.Abort()`),否则可能导致崩溃。示例代码展示了如何创建和管理线程,确保在线程中执行任务并在主线程中处理结果。完整代码包括线程池队列、主线程检查及线程安全的操作队列管理,确保多线程操作的稳定性和安全性。
|
3月前
|
并行计算 算法 安全
面试必问的多线程优化技巧与实战
多线程编程是现代软件开发中不可或缺的一部分,特别是在处理高并发场景和优化程序性能时。作为Java开发者,掌握多线程优化技巧不仅能够提升程序的执行效率,还能在面试中脱颖而出。本文将从多线程基础、线程与进程的区别、多线程的优势出发,深入探讨如何避免死锁与竞态条件、线程间的通信机制、线程池的使用优势、线程优化算法与数据结构的选择,以及硬件加速技术。通过多个Java示例,我们将揭示这些技术的底层原理与实现方法。
153 3
|
3月前
|
NoSQL Redis
单线程传奇Redis,为何引入多线程?
Redis 4.0 引入多线程支持,主要用于后台对象删除、处理阻塞命令和网络 I/O 等操作,以提高并发性和性能。尽管如此,Redis 仍保留单线程执行模型处理客户端请求,确保高效性和简单性。多线程仅用于优化后台任务,如异步删除过期对象和分担读写操作,从而提升整体性能。
89 1
|
4月前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
151 38
|
3月前
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
110 4
|
4月前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
120 8

热门文章

最新文章

相关实验场景

更多