Java Concurrency 简明教程

ThreadPoolExecutor Class

java.util.concurrent.ThreadPoolExecutor 是 ExecutorService,使用多个池线程中一个线程(通常由 Executors 工厂方法配置)执行每个提交的任务。它还提供各种实用方法来检查当前线程统计信息并控制它们。

ThreadPoolExecutor Methods

Sr.No.

Method & Description

1

protected void afterExecute(Runnable r, Throwable t) 给定的Runnable执行完毕后调用的方法。

2

void allowCoreThreadTimeOut(boolean value) 设置控制核心线程是否在没有任务在保留时间内到达的情况下超时并终止,并在需要时在有新任务到达时将其替换的策略。

3

boolean allowsCoreThreadTimeOut() 如果此线程池允许核心线程在没有任务在保留时间内到达的情况下超时并终止,并且并在需要时在有新任务到达时将其替换,则返回true。

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) 设置线程在终止前可以保持空闲的时间限制。

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() 当 Executor 终止时调用的方法。

33

String toString() 返回标识此线程池的字符串,以及它的状态,包括运行状态和估计的工作程序和任务数的指示。

Example

以下 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();
         }
      }
   }
}

这将产生以下结果。

Output

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