Yürütücü, YürütücüHizmet, Yürütücü - 1

"Merhaba, Amigo!"

"İlk oluşturulduğunda hiçbir şey mükemmel değildir. Aynısı iş parçacıkları için de geçerlidir. Zamanla, Java'nın yaratıcıları Runnable arayüzünün eksikliklerine ikna oldular. İstisnaların atılmasını desteklemiyordu ve bulmayı mümkün kılmıyordu. Yürütülen görevlerin sonucu..."

"Runnable arabirimi, her seferinde bir düzine çalıştırıp sonuçlarını toplamak istediğiniz küçük alt görevlerden çok, büyük bağımsız görevler için daha uygundur."

" Callable arabirimi bu yüzden icat edildi. Küçük görevlerin paralel yürütülmesi için Runnable ve Thread'den çok daha uygundur , çünkü kısmen genel bir arabirimdir."

"İşte arayüzün tipik bir uygulaması:"

Örnek
class ReverseString implements Callable<String>
{
 String str;

 ReverseString(String str)
 {
  this.str = str;
 }

 public String call() throws Exception
 {
  StringBuilder builder = new StringBuilder(str);
  builder.reverse();
  return builder.toString();
 }
}

" Runnable'dan farklı olarak burada, type bağımsız değişkeni tarafından belirtilen türün sonucunu döndüren call yöntemini geçersiz kılmamız gerekiyor. Bu yaklaşım, Runnable arayüzünün void döndüren run yönteminden çok daha kullanışlıdır. Bazen geliştiricilerin bir iş parçacığının sonucunu almak için çeşitli geçici çözümler."

"Anlıyorum."

"Şimdi Callable'ın ThreadPoolExecutor ile birlikte nasıl çalışabileceğine bakın:

"İlk olarak, ThreadPoolExecutor sınıfının gönderme yöntemi, parametreleştirilmiş bir Future nesnesi döndürür. Bir görevin bitip bitmediğini öğrenmek ve sonucu almak için bu nesneyi kullanabilirsiniz."

"Şu şekilde çalışır:"

Örnek
// 1. Create a ThreadPoolExecutor
ExecutorService service = Executors.newFixedThreadPool(5);

// 2. Add a task to it
Future<String> task = service.submit(new ReverseString("Amigo"));

// 3. Wait until the task is done
while(!task.isDone())
{
 Thread.sleep(1);
}

// 4. Try to get the result
//We will get either the result, or an exception if one occurred while the task was being executed
try
{
 System.out.println("Full string : " + task.get());
}
catch (Exception ie)
{
 ie.printStackTrace(System.err);
}

// 5. Stop the ThreadPool.
service.shutdown();

"Uzak! Özellikle Future sınıfını seviyorum. Hangi yöntemleri var?"

"İşte en ilginçleri:"

Yöntem Tanım
boolean cancel(boolean mayInterrupt);
Görevi durdurur.
boolean isCancelled();
Görev durdurulduysa true değerini döndürür.
boolean isDone();
Görev yürütülürken tamamlandıysa true değerini döndürür.
V get() throws InterruptedException, ExecutionException;
Çağrı yönteminin sonucunu döndürür veya gerçekleşmişse bir istisna atar.

"Harika! Böylece görevleri de durdurabilirsiniz."

"Buna çok fazla güvenmeyin; her iş parçacığı duramaz. Ancak bir görev hâlâ kuyruktaysa, o zaman bu iyi çalışır."

"Bu yaklaşımı beğendim. Kendi başınıza ileti dizileri oluşturup bunlardan bir sonuç çıkarmaya çalışmaktan çok daha uygun."

"Harika. Bugün burada bitireceğiz."