Future i zwrócenie częściowo obliczonego wyniki

0

Witam mam kod w Javie, którego zadaniem jest wykonanie obliczeń w osobnym wątku a następnie zwrócenie wyniku.

public class Main {
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		ExecutorService exec = Executors.newFixedThreadPool(2);
		
		Future<Integer> f = exec.submit(new Callable<Integer>() {
			public Integer call() throws Exception {
				int i = 0;
				while(i < 1000000000 && !Thread.interrupted()) {
					++i;
				}
				System.out.println("Interrupted!");
				return i;
			}
		});
		
		Thread.sleep(1000);
		f.cancel(true);
		System.out.println(f.get());
		
		exec.shutdown();
	}

}

Ten kod niestety nie jest poprawny gdyż przed f.get zostaje wywołance f.cancel co powoduje cancellation exception. Ogólnie problem jest taki, że chcę poczekać pewien czas na zadanie i jeżeli ono się nie zakończy w zadanym czasie - to chcę pobrać częściowo policzony wynik. Na to wygląda, że Java nie udostępnia mi bezpośrednio takiego mechanizmu. Czy ktoś wie jak mogę obejść ten problem?

0

Może coś takiego:

public class Main {
        public static void main(String[] args) throws InterruptedException, ExecutionException {
                ExecutorService exec = Executors.newFixedThreadPool(2);
                
                final MyTask task = new MyTask();
                Future<Integer> f = exec.submit(task);
                Thread.sleep(1000);
                task.interrupt();
                System.out.println(f.get());
                exec.shutdown();
        }
        
        private static class MyTask implements Callable<Integer> {
            private final AtomicBoolean interrupted = new AtomicBoolean(false);
            
            @Override
            public Integer call() throws Exception {
                int i = 0;
                while(i < 1000000000 && !this.interrupted.get()) {
                        ++i;
                }
                System.out.println("Interrupted!");
                return i;
            }
            
            public void interrupt() {
                this.interrupted.set(true);
            }
        }
}
0

Czy zadanie można podzielić na podzadania, które mogą być wykonywane w dowolnej kolejności?
Jeżeli tak, to podziel swoje zadanie na części i użyj klasy ExecutorCompletionService.

http://java.sun.com/javase/6/docs/api/java/util/concurrent/ExecutorCompletionService.html

0

Hej,
Charakter tego zadania jest właśnie taki jak w przykładzie, który wkleiłem - z każdą iteracją wynik się polepsza więc raczej nie mogę tego podzielić na podzadania.

0 użytkowników online, w tym zalogowanych: 0, gości: 0