ThreadPoolExecutor 클래스
java.util.concurrent.ThreadPoolExecutor는 일반적으로 Executors 팩토리 메소드를 사용하여 구성된 여러 풀링 된 스레드 중 하나를 사용하여 제출 된 각 작업을 실행하는 ExecutorService입니다. 또한 현재 스레드 통계를 확인하고 제어 할 수있는 다양한 유틸리티 메서드를 제공합니다.
ThreadPoolExecutor 메서드
Sr. 아니. | 방법 및 설명 |
---|---|
1 | protected void afterExecute(Runnable r, Throwable t) 지정된 Runnable 실행 완료시 호출되는 메서드입니다. |
2 | void allowCoreThreadTimeOut(boolean value) 연결 유지 시간 내에 작업이 도착하지 않으면 코어 스레드가 시간 초과되고 종료 될 수 있는지 여부를 제어하는 정책을 설정하고, 새 작업이 도착하면 필요한 경우 교체됩니다. |
삼 | boolean allowsCoreThreadTimeOut() 이 풀이 keepAlive 시간 내에 작업이 도착하지 않으면 코어 스레드가 시간 초과되고 종료되도록 허용하는 경우 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
이 실행자가 사용하는 태스크 큐를 리턴합니다. |
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() 실행 상태, 예상 작업자 및 작업 수의 표시를 포함하여이 풀과 상태를 식별하는 문자열을 반환합니다. |
예
다음 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