Java Callable 및 FutureTask 에 반환 값, 상태 제어 가능한 다중 스레드
먼저 자바에 대해 얘기해 주세요.lang.Runnable 은 인터페이스입니다. 이 인터페이스에는 run () 방법만 설명되어 있습니다.
public interface Runnable {
public abstract void run();
}
run () 방법은void 형식으로 되돌아오기 때문에 작업이 끝난 후에 결과를 되돌릴 수 없습니다.
Callable은 java에 있습니다.util.concurrent 패키지 아래, 그것도 하나의 인터페이스입니다. 그 안에서도 하나의 방법만 설명합니다. 단지 이 방법을call()라고 합니다.
public interface Callable<V> {
/**
* Computes a result, or throws an exception if unable to do so.
*
* @return computed result
* @throws Exception if unable to compute a result
*/
V call() throws Exception;
}
이것은 일반 인터페이스입니다.call () 함수가 되돌아오는 형식은 전달된 V 형식입니다.
그럼 Callable은 어떻게 사용하나요?일반적으로 Executor Service와 함께 사용되며 Executor Service 인터페이스에 다음과 같은 몇 가지 Submit 메서드 리셋 버전이 설명되어 있습니다.
<T> Future<T> submit(Callable<T> task);
<T> Future<T> submit(Runnable task, T result);
Future<?> submit(Runnable task);
첫 번째submit 방법의 매개 변수 형식은Callable입니다.
당분간 캘러블은 일반적으로 Executor 서비스와 협조하여 사용하는 것으로 알고 구체적인 사용 방법은 뒤에 설명하겠습니다.
일반적인 상황에서 우리는 첫 번째submit 방법과 세 번째submit 방법을 사용하고 두 번째submit 방법은 매우 적게 사용한다.
Future는 구체적인 Runnable 또는 Callable 작업의 실행 결과를 취소하고 완성 여부를 조회하며 결과를 얻는 것입니다.필요할 때 get 방법으로 실행 결과를 얻을 수 있습니다. 이 방법은 작업이 결과를 되돌릴 때까지 막힙니다.
Future 클래스는 java에 있습니다.util.concurrent 패키지 아래에는 인터페이스가 있습니다.
public interface Future<V> {
boolean cancel( boolean mayInterruptIfRunning);
boolean isCancelled();
boolean isDone();
V get() throws InterruptedException, ExecutionException;
V get( long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}
Future 인터페이스에서 설명하는 5가지 방법은 다음과 같습니다.
즉, Future는 세 가지 기능을 제공합니다.
1) 임무 수행 여부를 판단한다.
2) 작업을 중단할 수 있다.
3) 작업 수행 결과를 얻을 수 있습니다.
Future는 하나의 인터페이스이기 때문에 대상을 만드는 데 직접 사용할 수 없기 때문에 아래의 FutureTask가 있습니다.
2. Callable 이후 FutureTask 사용
2.1 간단한 사용
import java.util.concurrent.Callable;
import java.lang.Integer;
public class CallableTask implements Callable<Integer> {
@Override
public Integer call() throws Exception {
int hours=5;
int amount = 0;
while(hours>0){
System.out.println("I'm working,rest is "+hours);
amount++;
hours--;
Thread.sleep(1000);
}
return amount;
}
}
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class Boss {
public static void main(String args[]) throws ExecutionException{
CallableTask worker = new CallableTask();
FutureTask<Integer> jiangong = new FutureTask<Integer>(worker);
new Thread(jiangong).start();
while(!jiangong.isDone()){
try {
System.out.println(" ..."+jiangong.get());
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int amount;
try {
amount = jiangong.get();
System.out.println(" , "+amount);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.2 병렬 프로그래밍
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
public class Test {
public static void main(String[] args) {
//
ExecutorService executor = Executors.newCachedThreadPool();
Task task = new Task();
FutureTask<Integer> futureTask = new FutureTask<Integer>(task);
executor.submit(futureTask);
executor.shutdown();
// , , ExecutorService, Thread
/*Task task = new Task();
FutureTask<Integer> futureTask = new FutureTask<Integer>(task);
Thread thread = new Thread(futureTask);
thread.start();*/
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println(" ");
try {
System.out.println("task "+futureTask.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println(" ");
}
}
class Task implements Callable<Integer>{
@Override
public Integer call() throws Exception {
System.out.println(" ");
Thread.sleep(3000);
int sum = 0;
for(int i=0;i<100;i++)
sum += i;
return sum;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.