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

返回该执行器使用的任务队列。

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