11 Aralık 2019 Çarşamba

ExecutorService Arayüzü

Giriş
Şu satırı dahil ederiz.
import java.util.concurrent.ExecutorService;
Bu arayüzden kalıtan temel sınıflar şöyle.
ThreadPoolExecutor,ScheduledThreadPoolExecutor ve ForkJoinPool

ThreadPoolExecutor için kalıtım hiyerarşisi şöyle
Executor <- ExecutorService <--ThreadPoolExecutor veya ScheduledThreadPoolExecutor
İş Başlatma
Şu metodlar kullanılabilir.
execute(Runnable command)
submit(Callable task)
submit(Runnable task)
invokeAny(Collection<? extends Callable<T>> tasks)
invokeAll(Collection<? extends Callable<T>> tasks)
Kapatma
ExecutorService Kapatma  yazısına taşıdım

awaitTermination metodu
ExecutorService Kapatma  yazısına taşıdım

execute metodu - Callable
Örnek
Callable ile exception'ları yakalamak zorunda değiliz. Şöyle yaparız
ExecutorService executor = Executors.newSingleThreadExecutor();

// CALLABLE
executor.submit(() -> {
  while (true)
    throw new Exception();
});

// RUNNABLE: MUST BE HANDLED!
executor.submit(() -> {
  boolean value = true;
  while (value)
    throw new Exception();
});
execute metodu - Runnable
İmzası şöyle.
public abstract void execute(Runnable paramRunnable);
Örnek
Bu sefer Future almak için Callable nesnelerini biz sarmalıyoruz.
FutureTask<String> futureTask = new FutureTask<String>(new Callable<String>() {
  public String call() throws Exception {
    return ...;
  }
});
executor.execute(futureTask);
...
String value = futureTask.get();
invokeAny metodu
Açıklaması şöyle. Verilen işlerden başarıyla biten herhangi bir tanesinin sonucunu döner.
Executes the given tasks, returning the result of one that has completed successfully (i.e., without throwing an exception), if any do. Upon normal or exceptional return, tasks that have not completed are cancelled.
Örnek
Şöyle yaparız
List<Callable<String>> collection = Arrays.asList(
    () -> getIdFromResponse(response),
    () -> getIdFromRequest(request)
);

// you want the same number of threads as the size of the collection
ExecutorService executorService = Executors.newFixedThreadPool(collection.size());
String id = executorService.invokeAny(collection);
invokeAll metodu
Açıklaması şöyle. Verilen tüm işlerin bitmesini beklemek ve sonuçlarını toplamak için kullanılır.
Executes the given tasks, returning a list of Futures holding their status and results when all complete.
İmzası şöyle. Callable nesneler içeride Runnable nesneye dönecek şekilde sarmalanır.
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
                      throws InterruptedException
Verilen Callable listesindeki tüm işler bittikten sonra döner. Liste şöyle doldurulur.
List<Callable<Void>> tasks = new ArrayList<Callable<Void>>();
tasks.add(new Callable<Void>(){ ...} );
executorService.invokeAll(tasks);
isTerminated metodu
ExecutorService Kapatma  yazısına taşıdım

isShutDown metodu
ExecutorService Kapatma  yazısına taşıdım

submit metodu
Metod bir Future döndürür. Metodların imzaları şöyle. Callable bir sonuç dönebilir. Runnable ise dönmez. Runnable ve Callable kullanımı Nesneye Yönelik Programlamada güzel bir composition örneği sunuyor.
<T> Future<T> submit(Callable<T> task);
Future<?>     submit(Runnable task);
<T> Future<T> submit(Runnable task, T result);
Birinci metodu şöyle yaparız.
Future<String> future = executor.submit(new Callable() {
  public String call() throws Exception {
    ...
    return "OK";
  }
});
İkinci metodu şöyle yaparız.
service.submit(new Runnable() {
  public void run() {
    ...
  }
});
shutdown metodu
ExecutorService Kapatma  yazısına taşıdım

shutdownNow
ExecutorService Kapatma  yazısına taşıdım

Hiç yorum yok:

Yorum Gönder