스레드 풀은 여러 작업을 동시에 실행할 수 있습니다. 때로는 작업의 실행 결과를 추적 할 수도 있습니다. 일정 기간 내에도 작업이 완료되지 않으면 작업 실행을 취소 할 수도 있습니다. 이 기능을 지원하기 위해 ThreadPooleExecutor는 작업의 실행 및 취소를 추적하기위한 FutureTask를 제공합니다. 이 기사는 FutureTask의 구현 원리를 소개합니다.
FutureTask의 구현 원리를 더 잘 이해하기 위해 아래 그림과 같이 몇 가지 중요한 인터페이스 및 클래스 구조를 제공합니다.
ThreadPooleExecutor는 작업 제출을위한 제출 인터페이스를 제공합니다. 제출은 두 가지 다른 인터페이스를 지원합니다 : 런 가능하고 호출 가능. 통합 된 외부 인터페이스를 제공하기 위해 JDK는 내부적으로 런 가능하게 묶을 수있는 호출 가능로 랩핑되며,이 모든 것은 runnableadapter 어댑터를 통해 구현됩니다. 다음은 runnableadapter의 소스 코드입니다.
정적 최종 클래스 runnableadapter <t>는 Callable <t> {최종 실행 가능한 작업; 최종 T 결과; runnableadapter (runnable task, t result) {this.task = task; this.result = 결과; } public t call () {task.run (); 반환 결과; }}runnableadapter는 호출 방법을 구현하는 구현 클래스입니다. 통화 메소드는 단순히 task.run ()을 호출 한 다음 결과를 반환하여 호출 가능한 인터페이스 만 내부적으로 균일하게 처리해야합니다.
이전 섹션을 통해 제출 된 실행 가능한 작업이 내부적으로 호출 가능한 작업으로 변환된다는 것을 알고 있습니다. 미래 인 제출 방법의 반환 값을 확인하십시오. 실제로이 미래는 FutureTask 인스턴스입니다. 이 인스턴스를 통해 Get 메소드를 호출하면 작업이 완료되고 결과가 반환 될 때까지 현재 스레드를 차단할 수 있습니다.
전체 통화 체인은 다음과 같습니다.
작업자 스레드 -> futureetask.run () -> callable.call () -> task.run ()
호출 가능한 작업이 제출되면 처음 세 번의 전화 만 있습니다.
전체 프로세스를 더 잘 보여주기 위해 다음 예제가 실행 프로세스를 입증하는 데 사용됩니다.
1. 스레드 풀에 호출 가능한 작업을 제출합니다 (런 가능도는 Callable으로 변환됩니다). 현재 호출 가능은 다음과 같이 FutureTask 인스턴스로 전달됩니다.
2. 스레드 풀은 스레드를 사용하여 FutureTask 작업을 실행합니다.
작업 실행 프로세스는 비교적 간단합니다. 결국 Callable.call () 또는 runnable.run () 메소드가 호출되고 결과가 얻어지며,이 결과는 FutureTask 인스턴스의 결과 속성에 결과가 저장되고 상태가 정상으로 수정되어 작업이 실행되고 결과가 얻을 수 있음을 나타냅니다.
callable.call() 을 실행하는 동안 여러 스레드가 동일한 FutureTask 인스턴스의 Get 메소드를 호출한다고 가정합니다. 이 시점 에서이 스레드는 아래 그림과 같이 스택에 차단 및 저장됩니다.
스레드 1, 2 및 3 FutureTask.get 메소드를 호출합니다. 작업이 실행되지 않았으므로 세 개의 스레드가 모두 차단되고 졸려집니다. FutureTask에는 대기 스레드를 저장하기위한 스택이 있습니다. 스택의 상단 포인터는 FutureTask.waiters 에 의해 참조됩니다. 작업이 실행되면 전체 스택의 스레드가 반복됩니다. 현재 각 스레드가 깨어나고 작업 실행 결과를 성공적으로 얻을 수 있습니다 (실행 결과는 FutureTask.outcome) .
FutureTask는 또한 작업의 취소 기능을 지원하며,이 모든 작업은 FutureTask의 상태를 통해 여러 스레드를 조정합니다.
FutureTask 인터페이스는 작업 실행을 추적하고 제어하는 구현 메커니즘입니다. 스레드 풀 자체와 비교할 때 비교적 간단하며 이해하기 어렵지 않다고 생각합니다.
위는 Java 스레드 풀에서 Futuretask의 구현 원리에 대한이 기사의 모든 내용입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!