5 Ağustos 2019 Pazartesi

ExecutorCompletionService Sınıfı

Giriş
Bu sınıfın ExecutorService'ten farkı basitçe şöyle düşünülebilir.
  • ExecutorService = incoming queue + worker threads
  • CompletionService = incoming queue + worker threads + output queue
Açıklaması şöyle. İşler submit() metodu ile verildikten sonra bittikçe poll() veya take() metodu ile alınır.
you submit tasks to this, and it gives you them back in order of completion.
constructor - ExecutorService
ExecutorCompletionService dışarıdan verilen bir ExecutorService kullanır.
Örnek
Şöyle yaparız
ThreadPoolExecutor executor = new ThreadPoolExecutor = ...;
ExecutorCompletionService service = new ExecutorCompletionService(executor);
Örnek
Şöyle yaparız.
ExecutorService pool = Executors.newFixedThreadPool(5);
ExecutorCompletionService<String> service = new ExecutorCompletionService<>
(pool);
poll metodu
take() metodu gibi bitmiş işi döndürür. Eğe bitmiş iş yoksa null döndürür.
Şöyle yaparız.
completionService.poll(100,TimeUnit.MILLISECONDS);
submit metodu
Şöyle yaparız.
Runnable r = ...;
completionService.submit(r);
take metodu
ExecutorCompletionService'e bir dizi iş verilirse, tüm işlerin bitmesini beklemek gerekmez. Biten işler take() metodu ile alınabilir. Eğer bitmiş iş yoksa bloke olur.
Örnek
Şöyle yaparız
ExecutorService service = Executors.newFixedThreadPool(1);
ExecutorCompletionService<Integer> comp = new ExecutorCompletionService<>(service);

comp.submit(task);
// ... I assume you want to submit N tasks.

for (int i = 0; i < N; ++i) {
  Future<Integer> future = comp.take();
  Integer result = future.get();

  // ... do something with the result ...
}
Örnek
Şöyle yaparız.
ExecutorService pool = Executors.newFixedThreadPool(2);
CompletionService<String> service = new ExecutorCompletionService<String>(pool);
final List<? extends Callable<String>> callables = Arrays.asList(
    new SleepingCallable("slow", 5000),
    new SleepingCallable("quick", 500));
for (final Callable<String> callable : callables) {
  service.submit(callable);
}
pool.shutdown();
try {
  while (!pool.isTerminated()) {
    final Future<String> future = service.take();
    System.out.println(future.get());
  }
} catch (ExecutionException | InterruptedException ex) { }



Hiç yorum yok:

Yorum Gönder