문제

방금 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 방법, 작업의 각 실행 결과를 다른 스레드의 리스너에게 다시보고합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top