얼마 전에 Java Callable Future 인터페이스에 관한 포스트를 작성했습니다. 우리는 스레드의 동시 처리 이점을 얻을 수 있을 뿐만 아니라 호출 프로그램에 값을 반환할 수 있는 것입니다. FutureTask는 Future 인터페이스의 기본 구체적인 구현체이며 비동기 처리를 제공합니다. 작업을 시작하고 취소할 수 있는 메서드와 완료되었는지 또는 취소되었는지의 상태를 반환할 수 있는 메서드가 포함되어 있습니다. 미래의 작업을 만들기 위해 호출 가능한 객체가 필요하며, 그런 다음 Java Thread Pool Executor를 사용하여 이러한 작업을 비동기적으로 처리할 수 있습니다. 간단한 프로그램과 함께 FutureTask의 예제를 살펴보겠습니다. FutureTask는 호출 가능한 객체가 필요하므로 간단한 Callable 구현을 만들 것입니다.
package com.journaldev.threads;
import java.util.concurrent.Callable;
public class MyCallable implements Callable {
private long waitTime;
public MyCallable(int timeInMillis){
this.waitTime=timeInMillis;
}
@Override
public String call() throws Exception {
Thread.sleep(waitTime);
//이 호출 가능한 작업을 실행하는 스레드 이름을 반환
return Thread.currentThread().getName();
}
}
여기에 FutureTask 메서드의 예와 FutureTask의 일반적으로 사용되는 메서드가 표시되어 있습니다.
package com.journaldev.threads;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
public class FutureTaskExample {
public static void main(String[] args) {
MyCallable callable1 = new MyCallable(1000);
MyCallable callable2 = new MyCallable(2000);
FutureTask futureTask1 = new FutureTask(callable1);
FutureTask futureTask2 = new FutureTask(callable2);
ExecutorService executor = Executors.newFixedThreadPool(2);
executor.execute(futureTask1);
executor.execute(futureTask2);
while (true) {
try {
if(futureTask1.isDone() && futureTask2.isDone()){
System.out.println("Done");
//실행자 서비스를 종료
executor.shutdown();
return;
}
if(!futureTask1.isDone()){
//미래의 작업이 완료될 때까지 무기한 대기
System.out.println("FutureTask1 output="+futureTask1.get());
}
System.out.println("Waiting for FutureTask2 to complete");
String s = futureTask2.get(200L, TimeUnit.MILLISECONDS);
if(s !=null){
System.out.println("FutureTask2 output="+s);
}
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}catch(TimeoutException e){
//아무것도 하지 않음
}
}
}
}
프로그램을 실행하면 FutureTask
의 get()
메서드가 작업이 완료될 때까지 기다리고 나서 출력 개체를 반환하기 때문에 어느 동안은 아무 것도 인쇄되지 않음을 알 수 있습니다. 특정 시간 동안만 대기하도록 오버로드된 메서드도 있으며, 우리는 이를 futureTask2에 사용하고 있습니다. 또한 모든 작업이 실행된 후에 프로그램이 종료되도록하려면 isDone()
메서드의 사용에 주목하십시오. 위 프로그램의 출력은 다음과 같을 것입니다:
FutureTask1 output=pool-1-thread-1
Waiting for FutureTask2 to complete
Waiting for FutureTask2 to complete
Waiting for FutureTask2 to complete
Waiting for FutureTask2 to complete
Waiting for FutureTask2 to complete
FutureTask2 output=pool-1-thread-2
Done
FutureTask에는 혜택이 없지만 Future 인터페이스 메서드 중 일부를 재정의하고 Future 인터페이스의 모든 메서드를 구현하고 싶지 않을 때 편리합니다.
Source:
https://www.digitalocean.com/community/tutorials/java-futuretask-example-program