자바 FutureTask 예제 프로그램

얼마 전에 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){
				//아무것도 하지 않음
			}
		}
		
	}

}

프로그램을 실행하면 FutureTaskget() 메서드가 작업이 완료될 때까지 기다리고 나서 출력 개체를 반환하기 때문에 어느 동안은 아무 것도 인쇄되지 않음을 알 수 있습니다. 특정 시간 동안만 대기하도록 오버로드된 메서드도 있으며, 우리는 이를 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