Java并发编程 - ThreadPoolExecutor 应用

简介: Java并发编程 - ThreadPoolExecutor 应用

newCachedThreadPool:       可缓存线程池,可灵活回收空闲线程

newFixedThreadPool:          定长线程池,可控制线程的最大并发数,超出的线程会在队列中等待

newScheduledThreadPool:  定时线程池,支持定时和周期性任务的执行

newSingleThreadExecutor:  单线程化的线程池,保证所有任务按照指定顺序(先入先出,优先级等)执行


newCachedThreadPool

packagecom.mmall.concurrency.example.threadPool;
importlombok.extern.slf4j.Slf4j;
importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;
@Slf4jpublicclassThreadPoolExample1 {
publicstaticvoidmain(String[] args) {
ExecutorServiceexecutorService=Executors.newCachedThreadPool();
for (inti=0; i<10; i++) {
finalintindex=i;
executorService.execute(newRunnable() {
@Overridepublicvoidrun() {
log.info("task:{}", index);
                }
            });
        }
executorService.shutdown();
    }
}
// 输出10:57:37.683 [pool-1-thread-1] INFOc.m.c.example.threadPool.test9-task:010:57:37.683 [pool-1-thread-8] INFOc.m.c.example.threadPool.test9-task:710:57:37.683 [pool-1-thread-6] INFOc.m.c.example.threadPool.test9-task:510:57:37.683 [pool-1-thread-10] INFOc.m.c.example.threadPool.test9-task:910:57:37.683 [pool-1-thread-3] INFOc.m.c.example.threadPool.test9-task:210:57:37.683 [pool-1-thread-9] INFOc.m.c.example.threadPool.test9-task:810:57:37.683 [pool-1-thread-4] INFOc.m.c.example.threadPool.test9-task:310:57:37.683 [pool-1-thread-5] INFOc.m.c.example.threadPool.test9-task:410:57:37.683 [pool-1-thread-2] INFOc.m.c.example.threadPool.test9-task:110:57:37.683 [pool-1-thread-7] INFOc.m.c.example.threadPool.test9-task:6Processfinishedwithexitcode0

newFixedThreadPool

packagecom.mmall.concurrency.example.threadPool;
importlombok.extern.slf4j.Slf4j;
importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;
@Slf4jpublicclassThreadPoolExample2 {
publicstaticvoidmain(String[] args) {
ExecutorServiceexecutorService=Executors.newFixedThreadPool(3);
for (inti=0; i<10; i++) {
finalintindex=i;
executorService.execute(newRunnable() {
@Overridepublicvoidrun() {
log.info("task:{}", index);
                }
            });
        }
executorService.shutdown();
    }
}
// 输出11:06:59.613 [pool-1-thread-3] INFOc.m.c.example.threadPool.test9-task:211:06:59.613 [pool-1-thread-1] INFOc.m.c.example.threadPool.test9-task:011:06:59.613 [pool-1-thread-2] INFOc.m.c.example.threadPool.test9-task:111:06:59.617 [pool-1-thread-3] INFOc.m.c.example.threadPool.test9-task:311:06:59.617 [pool-1-thread-3] INFOc.m.c.example.threadPool.test9-task:611:06:59.617 [pool-1-thread-1] INFOc.m.c.example.threadPool.test9-task:411:06:59.617 [pool-1-thread-3] INFOc.m.c.example.threadPool.test9-task:711:06:59.618 [pool-1-thread-1] INFOc.m.c.example.threadPool.test9-task:811:06:59.617 [pool-1-thread-2] INFOc.m.c.example.threadPool.test9-task:511:06:59.618 [pool-1-thread-3] INFOc.m.c.example.threadPool.test9-task:9Processfinishedwithexitcode0

newSingleThreadExecutor

packagecom.mmall.concurrency.example.threadPool;
importlombok.extern.slf4j.Slf4j;
importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;
@Slf4jpublicclassThreadPoolExample3 {
publicstaticvoidmain(String[] args) {
ExecutorServiceexecutorService=Executors.newSingleThreadExecutor();
for (inti=0; i<10; i++) {
finalintindex=i;
executorService.execute(newRunnable() {
@Overridepublicvoidrun() {
log.info("task:{}", index);
                }
            });
        }
executorService.shutdown();
    }
}
// 输出11:08:19.913 [pool-1-thread-1] INFOc.m.c.example.threadPool.test9-task:011:08:19.918 [pool-1-thread-1] INFOc.m.c.example.threadPool.test9-task:111:08:19.919 [pool-1-thread-1] INFOc.m.c.example.threadPool.test9-task:211:08:19.919 [pool-1-thread-1] INFOc.m.c.example.threadPool.test9-task:311:08:19.919 [pool-1-thread-1] INFOc.m.c.example.threadPool.test9-task:411:08:19.919 [pool-1-thread-1] INFOc.m.c.example.threadPool.test9-task:511:08:19.919 [pool-1-thread-1] INFOc.m.c.example.threadPool.test9-task:611:08:19.919 [pool-1-thread-1] INFOc.m.c.example.threadPool.test9-task:711:08:19.919 [pool-1-thread-1] INFOc.m.c.example.threadPool.test9-task:811:08:19.919 [pool-1-thread-1] INFOc.m.c.example.threadPool.test9-task:9Processfinishedwithexitcode0

newScheduledThreadPool

packagecom.mmall.concurrency.example.threadPool;
importlombok.extern.slf4j.Slf4j;
importjava.util.Date;
importjava.util.Timer;
importjava.util.TimerTask;
importjava.util.concurrent.Executors;
importjava.util.concurrent.ScheduledExecutorService;
importjava.util.concurrent.TimeUnit;
@Slf4jpublicclassThreadPoolExample4 {
publicstaticvoidmain(String[] args) {
ScheduledExecutorServiceexecutorService=Executors.newScheduledThreadPool(1);
//        executorService.schedule(new Runnable() {//            @Override//            public void run() {//                log.warn("schedule run");//            }//        }, 3, TimeUnit.SECONDS);executorService.scheduleAtFixedRate(newRunnable() {
@Overridepublicvoidrun() {
log.warn("schedule run");
            }
        }, 1, 3, TimeUnit.SECONDS);
//        executorService.shutdown();Timertimer=newTimer();
timer.schedule(newTimerTask() {
@Overridepublicvoidrun() {
log.warn("timer run");
            }
        }, newDate(), 5*1000);
    }
}
// 输出11:09:04.287 [Timer-0] WARNc.m.c.example.threadPool.test9-timerrun11:09:05.285 [pool-1-thread-1] WARNc.m.c.example.threadPool.test9-schedulerun11:09:08.286 [pool-1-thread-1] WARNc.m.c.example.threadPool.test9-schedulerun11:09:09.286 [Timer-0] WARNc.m.c.example.threadPool.test9-timerrun11:09:11.284 [pool-1-thread-1] WARNc.m.c.example.threadPool.test9-schedulerun11:09:14.286 [pool-1-thread-1] WARNc.m.c.example.threadPool.test9-schedulerun11:09:14.286 [Timer-0] WARNc.m.c.example.threadPool.test9-timerrun11:09:17.287 [pool-1-thread-1] WARNc.m.c.example.threadPool.test9-schedulerun11:09:19.287 [Timer-0] WARNc.m.c.example.threadPool.test9-timerrun11:09:20.286 [pool-1-thread-1] WARNc.m.c.example.threadPool.test9-schedulerun
目录
相关文章
|
8天前
|
安全 Java 程序员
深入理解Java内存模型与并发编程####
本文旨在探讨Java内存模型(JMM)的复杂性及其对并发编程的影响,不同于传统的摘要形式,本文将以一个实际案例为引子,逐步揭示JMM的核心概念,包括原子性、可见性、有序性,以及这些特性在多线程环境下的具体表现。通过对比分析不同并发工具类的应用,如synchronized、volatile关键字、Lock接口及其实现等,本文将展示如何在实践中有效利用JMM来设计高效且安全的并发程序。最后,还将简要介绍Java 8及更高版本中引入的新特性,如StampedLock,以及它们如何进一步优化多线程编程模型。 ####
16 0
|
10天前
|
Java 程序员
Java编程中的异常处理:从基础到高级
在Java的世界中,异常处理是代码健壮性的守护神。本文将带你从异常的基本概念出发,逐步深入到高级用法,探索如何优雅地处理程序中的错误和异常情况。通过实际案例,我们将一起学习如何编写更可靠、更易于维护的Java代码。准备好了吗?让我们一起踏上这段旅程,解锁Java异常处理的秘密!
|
7天前
|
安全 算法 Java
Java多线程编程中的陷阱与最佳实践####
本文探讨了Java多线程编程中常见的陷阱,并介绍了如何通过最佳实践来避免这些问题。我们将从基础概念入手,逐步深入到具体的代码示例,帮助开发者更好地理解和应用多线程技术。无论是初学者还是有经验的开发者,都能从中获得有价值的见解和建议。 ####
|
7天前
|
Java 调度
Java中的多线程编程与并发控制
本文深入探讨了Java编程语言中多线程编程的基础知识和并发控制机制。文章首先介绍了多线程的基本概念,包括线程的定义、生命周期以及在Java中创建和管理线程的方法。接着,详细讲解了Java提供的同步机制,如synchronized关键字、wait()和notify()方法等,以及如何通过这些机制实现线程间的协调与通信。最后,本文还讨论了一些常见的并发问题,例如死锁、竞态条件等,并提供了相应的解决策略。
24 3
|
13天前
|
缓存 Java 开发者
Java多线程并发编程:同步机制与实践应用
本文深入探讨Java多线程中的同步机制,分析了多线程并发带来的数据不一致等问题,详细介绍了`synchronized`关键字、`ReentrantLock`显式锁及`ReentrantReadWriteLock`读写锁的应用,结合代码示例展示了如何有效解决竞态条件,提升程序性能与稳定性。
40 5
|
11天前
|
监控 Java 数据库连接
Java线程管理:守护线程与用户线程的区分与应用
在Java多线程编程中,线程可以分为守护线程(Daemon Thread)和用户线程(User Thread)。这两种线程在行为和用途上有着明显的区别,了解它们的差异对于编写高效、稳定的并发程序至关重要。
21 2
|
12天前
|
开发框架 安全 Java
Java 反射机制:动态编程的强大利器
Java反射机制允许程序在运行时检查类、接口、字段和方法的信息,并能操作对象。它提供了一种动态编程的方式,使得代码更加灵活,能够适应未知的或变化的需求,是开发框架和库的重要工具。
32 2
|
13天前
|
安全 Java 开发者
Java中的多线程编程:从基础到实践
本文深入探讨了Java多线程编程的核心概念和实践技巧,旨在帮助读者理解多线程的工作原理,掌握线程的创建、管理和同步机制。通过具体示例和最佳实践,本文展示了如何在Java应用中有效地利用多线程技术,提高程序性能和响应速度。
49 1
|
Java 安全 数据库
java多线程系列:ThreadPoolExecutor源码分析
前言 这篇主要讲述ThreadPoolExecutor的源码分析,贯穿类的创建、任务的添加到线程池的关闭整个流程,让你知其然所以然。希望你可以通过本篇博文知道ThreadPoolExecutor是怎么添加任务、执行任务的,以及延伸的知识点。
1196 0
|
13天前
|
设计模式 Java 开发者
Java多线程编程的陷阱与解决方案####
本文深入探讨了Java多线程编程中常见的问题及其解决策略。通过分析竞态条件、死锁、活锁等典型场景,并结合代码示例和实用技巧,帮助开发者有效避免这些陷阱,提升并发程序的稳定性和性能。 ####