Java 다중 스레드 Future, FutureTask 사용 예시, 비동기식 결과 반환
3437 단어 2019 기사
최근에 다중 스레드 코드를 써서 배웠습니다. 자바 다중 스레드는 비동기 작업의 결과를 기다리고 있습니다.
Future, FutureTask 소개
Future는 비동기식 결과를 반환하는 인터페이스입니다.
FutureTask는 클래스이며 Future의 구현입니다.
주요 방법
future.get();
future.get(10000, TimeUnit.MILLISECONDS);
다중 루틴의 비동기 실행 결과를 가져오지만 get 방법은 동기화 방법입니다. 결과를 얻지 못하거나 시간을 초과하지 않으면 주 루틴은 계속 기다립니다.
future.cancel(boolean flag)
현재future가 비동기적인 결과를 얻었는지, 아니면 비동기적인 다중 루틴이 실행되고 결과를 되돌렸는지 판단합니다
future.isCancelled()
현재future에서 비동기적인 결과를 가져오는 작업이 취소되었는지 판단합니다.
장면 작업
원격에서 데이터를 얻는 계산 결과는 일정한 시간이 필요하고, 뒤의 코드는 이 데이터와 잠시 관계가 없으며, 마지막에 이르러서야 이 데이터를 사용할 수 있다.비동기 함수를 호출한 후 즉시 되돌려줍니다. 주 라인은 계속 아래로 실행됩니다. 비동기 라인의 데이터를 사용해야 할 때 다시 호출해서 이 비동기 라인의 데이터를 가져오거나 기다리십시오.
코드 예
package com.test.thread.future;
import java.util.HashMap;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
* @author javaloveiphone
* @date :2017 2 7 11:33:11
* @Description:
*/
public class FutureTest {
public static void main(String[] args) throws InterruptedException, ExecutionException {
System.out.println("==== ");
//
ExecutorService threadPool = Executors.newCachedThreadPool();
//
System.out.println("==== ");
Future> future = threadPool.submit(new Callable>() {
@Override
public HashMap call() throws Exception {
System.out.println(" ....");
Thread.sleep(2000);
System.out.println(" , !!!!");
return new HashMap(){
{this.put("futureKey", " future ");}
};
}
});
System.out.println("==== , ");
Thread.sleep(1000);
System.out.println("==== ");
boolean flag = true;
while(flag){
// ,
if(future.isDone() && !future.isCancelled()){
HashMap futureResult = future.get();
System.out.println("==== :"+futureResult.get("futureKey"));
flag = false;
}
}
//
if(!threadPool.isShutdown()){
threadPool.shutdown();
}
}
}
결과는 다음과 같이 인쇄됩니다.
====
====
==== ,
....
====
, !!!!
==== : future
FutureTask 클래스
FutureTask 클래스는 Future의 구현이고 Future는 Runnable을 실현할 수 있기 때문에threadPool을 통해 실행할 수 있습니다.예를 들어, 위에서 submit이 있는 구조를 다음과 같이 바꿀 수 있습니다(단순화를 위해 String 유형을 반환).
FutureTask future = new FutureTask(new Callable() {
public String call() {
return " future ";
}
});
threadPool.execute(future);
CountDownLatch를 사용하면 사용과 해석이 더욱 쉽습니다.https://blog.csdn.net/zhanhong39/article/details/84403295