ThreadPoolExecutor 类
java.util.concurrent.ThreadPoolExecutor 是一个 ExecutorService,用于使用可能的多个池线程之一来执行每个提交的任务,通常使用 Executors 工厂方法进行配置。 它还提供了各种实用方法来检查当前线程统计信息并控制它们。
ThreadPoolExecutor 方法
Sr.No. | 方法及描述 |
---|---|
1 | protected void afterExecute(Runnable r, Throwable t) 给定 Runnable 执行完成后调用的方法。 |
2 | void allowCoreThreadTimeOut(boolean value) 设置策略,控制如果在保持活动时间内没有任务到达,核心线程是否可能超时并终止,并在新任务到达时根据需要进行替换。 |
3 | boolean allowsCoreThreadTimeOut() 如果该池允许核心线程超时,则返回 true,如果在 keepAlive 时间内没有任务到达则终止,并在新任务到达时根据需要进行替换。 |
4 | boolean awaitTermination(long timeout, TimeUnit unit) 阻塞,直到所有任务在关闭请求后完成执行,或者发生超时,或者当前线程被中断,以先发生者为准。 |
5 | protected void beforeExecute(Thread t, Runnable r) 在给定线程中执行给定 Runnable 之前调用的方法。 |
6 | void execute(Runnable command) 在将来的某个时间执行给定的任务。 |
7 | protected void finalize() 当不再引用此执行程序并且它没有线程时调用关闭。 |
8 | int getActiveCount() 返回正在主动执行任务的线程的大致数量。 |
9 | long getCompletedTaskCount() 返回已完成执行的任务的大致总数。 |
10 | int getCorePoolSize() 返回线程的核心数。 |
11 | long getKeepAliveTime(TimeUnit unit) 返回线程保持活动时间,即超过核心池大小的线程在终止之前可以保持空闲的时间。 |
12 | int getLargestPoolSize() 返回池中同时存在的最大线程数。 |
13 | int getMaximumPoolSize() 返回允许的最大线程数。 |
14 | int getPoolSize() 返回池中当前的线程数。 |
15 | BlockingQueue 返回该执行器使用的任务队列。 |
15 | RejectedExecutionHandler getRejectedExecutionHandler() 返回不可执行任务的当前处理程序。 |
16 | long getTaskCount() 返回已计划执行的任务的大致总数。 |
17 | ThreadFactory getThreadFactory() 返回用于创建新线程的线程工厂。 |
18 | boolean isShutdown() 如果该执行器已关闭,则返回 true。 |
19 | boolean isTerminated() 如果关闭后所有任务均已完成,则返回 true。 |
20 | boolean isTerminating() 如果执行器在 shutdown() 或 shutdownNow() 之后正在终止但尚未完全终止,则返回 true。 |
21 | int prestartAllCoreThreads() 启动所有核心线程,导致它们空闲等待工作。 |
22 | boolean prestartCoreThread() 启动核心线程,使其空闲等待工作。 |
23 | void purge() 尝试从工作队列中删除所有已取消的 Future 任务。 |
24 | boolean remove(Runnable task) 从执行程序的内部队列中删除此任务(如果存在),从而导致它在尚未启动时不会运行。 |
25 | void setCorePoolSize(int corePoolSize) 设置线程的核心数量。 |
26 | void setKeepAliveTime(long time, TimeUnit unit) Sets the time limit for which threads may remain idle before being terminated. |
27 | void setMaximumPoolSize(int maximumPoolSize) 设置允许的最大线程数。 |
28 | void setRejectedExecutionHandler(RejectedExecutionHandler handler) 为不可执行的任务设置新的处理程序。 |
29 | void setThreadFactory(ThreadFactory threadFactory) 设置用于创建新线程的线程工厂。 |
30 | void shutdown() 启动有序关闭,其中执行先前提交的任务,但不会接受新任务。 |
31 | List<Runnable> shutdownNow() 尝试停止所有正在执行的任务,停止正在等待的任务的处理,并返回正在等待执行的任务的列表。 |
32 | protected void terminated() 执行器终止时调用的方法。 |
33 | String toString() 返回标识此池及其状态的字符串,包括运行状态以及估计的工作人员和任务计数的指示。 |
示例
以下 TestThread 程序显示了 ThreadPoolExecutor 接口在基于线程的环境中的用法。
import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class TestThread { public static void main(final String[] arguments) throws InterruptedException { ThreadPoolExecutor executor = (ThreadPoolExecutor)Executors.newCachedThreadPool(); //Stats before tasks execution System.out.println("Largest executions: " + executor.getLargestPoolSize()); System.out.println("Maximum allowed threads: " + executor.getMaximumPoolSize()); System.out.println("Current threads in pool: " + executor.getPoolSize()); System.out.println("Currently executing threads: " + executor.getActiveCount()); System.out.println("Total number of threads(ever scheduled): " + executor.getTaskCount()); executor.submit(new Task()); executor.submit(new Task()); //Stats after tasks execution System.out.println("Core threads: " + executor.getCorePoolSize()); System.out.println("Largest executions: " + executor.getLargestPoolSize()); System.out.println("Maximum allowed threads: " + executor.getMaximumPoolSize()); System.out.println("Current threads in pool: " + executor.getPoolSize()); System.out.println("Currently executing threads: " + executor.getActiveCount()); System.out.println("Total number of threads(ever scheduled): " + executor.getTaskCount()); executor.shutdown(); } static class Task implements Runnable { public void run() { try { Long duration = (long) (Math.random() * 5); System.out.println("Running Task! Thread Name: " + Thread.currentThread().getName()); TimeUnit.SECONDS.sleep(duration); System.out.println("Task Completed! Thread Name: " + Thread.currentThread().getName()); } catch (InterruptedException e) { e.printStackTrace(); } } } }
这将产生以下结果。
输出
Largest executions: 0 Maximum allowed threads: 2147483647 Current threads in pool: 0 Currently executing threads: 0 Total number of threads(ever scheduled): 0 Core threads: 0 Largest executions: 2 Maximum allowed threads: 2147483647 Current threads in pool: 2 Currently executing threads: 2 Total number of threads(ever scheduled): 2 Running Task! Thread Name: pool-1-thread-2 Running Task! Thread Name: pool-1-thread-1 Task Completed! Thread Name: pool-1-thread-1 Task Completed! Thread Name: pool-1-thread-2