Java Scheduledexecutorservice 및 Futuretask에 대한 명확성을 찾고 있습니다
-
19-09-2019 - |
문제
방금 Java의 미래와 ScheduledExecutorservice를 조사하기 시작했으며, 내가 표시 한 일정에서 내 호출 가능이 실행되지 않는 이유가 궁금합니다. 이 샘플 코드에서 호출 가능은 한 번 실행되지만 앱은 결코 완료되지 않으며 작업이 다시 실행되지 않습니다. 이것이 제가 예상했던 것입니다 (문제는 내 기대와 관련이 있다고 확신합니다).
달리기는 잘 작동합니다. Callables는 영원히 차단되는 것처럼 보이지만 왜 그런지 잘 모르겠습니다 .... 내가 무엇을 놓치고 있습니까?
감사!
public class ExecutorExample {
/**
* @param args
* @throws ExecutionException
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException, ExecutionException {
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(5);
FutureTask<ArrayList<String>> ft1 = new FutureTask<ArrayList<String>>(new Callable<ArrayList<String>>(){
@Override
public ArrayList<String> call() {
ArrayList<String> stuff = new ArrayList<String>();
for(int i = 0;i<10;i++){
String thing ="Adding " + i + " to result";
stuff.add(thing);
System.out.println(thing);
}
return stuff;
}});
scheduler.scheduleAtFixedRate(ft1, 0, 1, TimeUnit.SECONDS);
System.out.println(ft1.get());
System.out.println(ft1.isDone());
}
}
해결책
문제는 그 것입니다 FutureTask
클래스 문서에 따르면 "계산이 완료되면 계산을 다시 시작하거나 취소 할 수 없습니다."
후 run
의 방법 FutureTask
한 번 호출되었고, 후속 호출은 작업의 위임없이 즉시 반환됩니다. Callable
사례.
만 a Runnable
반복되는 작업으로 사용할 수 있으며 결과를 전달할 수는 없습니다. 대신에, Runnable
작업의 끝에서 호출 할 수있는 콜백 작업 run
방법, 작업의 각 실행 결과를 다른 스레드의 리스너에게 다시보고합니다.
제휴하지 않습니다 StackOverflow