Java ExecutorService, iş parçacığı üzerindeki görevleri eşzamansız olarak yürütmemize olanak sağlayan arayüzdür. Java ExecutorService arayüzü java.util.concurrent paketinde mevcuttur. ExecutorService, bir iş parçacığı havuzunun korunmasına yardımcı olur ve onlara görevler atar. Ayrıca, görev sayısı mevcut iş parçacığından fazlaysa, boş bir iş parçacığı bulunana kadar görevleri sıraya koyma olanağı da sağlar.
işaretleme dipnotları
Java ExecutorService Yöntemleri
Yöntem | Tanım |
---|---|
boolean waitTermination(uzun zaman aşımı, TimeUnit birimi) | Bu yöntem, kapatma isteğinden sonra tüm görevler tamamlanana veya belirtilen zaman aşımı gerçekleşene veya geçerli iş parçacığı kesintiye uğrayana kadar (hangisi önce gerçekleşirse) ExecutorService'e girme görevini engeller. |
Liste | Bu yöntem verilen görevlerin listesini yürütür ve tamamlandığında tüm görevlerin sonuçlarını içeren Vadeli İşlemler listesini döndürür. |
Liste | Bu yöntem, verilen görevlerin listesini yürütür ve tamamlandığında veya zaman aşımı süresi dolduğunda (hangisi önce gerçekleşirse) tüm görevlerin sonuçlarını içeren Vadeli İşlemler listesini döndürür. |
T invokeAny(Koleksiyon extends Callable>görevler) | Bu yöntem, verilen görevlerin listesini yürütür ve herhangi bir istisna atmadan tamamlanan bir görevin sonucunu döndürür. |
T invokeAny(Koleksiyon extends Callable>görevler, uzun zaman aşımı, TimeUnit birimi) | Bu yöntem, verilen görevlerin listesini yürütür ve zaman aşımı süresi dolmadan herhangi bir istisna atmadan tamamlanan bir görevin sonucunu döndürür. |
boolean isShutdown() | Bu yöntem, verilen uygulayıcının kapatılıp kapatılmadığını döndürür. |
boolean isTerminated() | Bu yöntem, kapatmanın ardından tüm görevler yürütülürse true değerini döndürür. |
geçersiz kapatma() | Bu yöntem, ExecutorService'e daha önce gönderilen görevlerin tamamlanmasına izin verir ve başka görevlerin kabul edilmesine izin vermez. |
ShutdownNow()'u listele | Bu yöntem, aktif olarak yürütülen tüm görevleri durdurur, sıraya alınmış görevlerin yürütülmesini durdurur ve sıraya alınmış görevlerin listesini döndürür. |
Gelecekteki gönderim (Çağrılabilir görev) | Bu yöntem, yürütme için değer döndüren bir görev gönderir ve görevin bekleyen sonucunu temsil eden Geleceği döndürür. |
Gelecekteki gönderim (Çalıştırılabilir görev) | Bu yöntem, yürütülmesi için bir görev gönderir ve bu görevi temsil eden bir Gelecek döndürür. Başarılı bir şekilde tamamlandığında null değerini döndürür. |
Gelecekteki gönderim (Çalıştırılabilir görev, T sonucu) | Bu yöntem, yürütülmesi için bir görev gönderir ve bu görevi temsil eden bir Gelecek döndürür. |
Basit bir Java ExecutorService programı
public class ExecutorServiceExample { public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(10); executorService.execute(new Runnable() { @Override public void run() { System.out.println('ExecutorService'); } }); executorService.shutdown(); } }
Çıktı:
Bu programda on thread'li bir ExecutorService oluşturup ona 'ExecutorService' yazdırmak için bir görev gerçekleştiren anonim çalıştırılabilir bir uygulama atadık ve görevi bittikten sonra executor servisini kapatıyoruz.
Java ExecutorService nasıl kullanılır?
ExecutorService'in Örneklenmesi
Tek bir iş parçacığı, bir iş parçacığı havuzu veya zamanlanmış bir iş parçacığı havuzu oluşturmak için Java ExecutorService'i kullanabiliriz. Executors sınıfı, bir ExecutorService örneğini oluşturmak için aşağıdaki gibi fabrika yöntemleri sağlar:
ExecutorService executorService1 = Executors.newSingleThreadExecutor(); //Creates //a ExecutorService object having a single thread. ExecutorService executorService2 = Executors.newFixedThreadPool(10); // Creates a //ExecutorService object having a pool of 10 threads. ExecutorService executorService3 = Executors.newScheduledThreadPool(10); //Creates a scheduled thread pool executor with 10 threads. In scheduled thread //pool, we can schedule tasks of the threads.
ExecutorServices'e görev atama
ExecutorService'e bir görev atamak için aşağıdaki yöntemleri kullanabiliriz:
- yürüt(Çalıştırılabilir görev)
- gönder(Çalıştırılabilir görev) / gönder(Çağrılabilir görev)
- invokeAny(Koleksiyon extends Callable>görevler)
- invokeAll(Koleksiyon extends Callable>görevler)
Yürütme() yöntemini kullanarak ExecutorService'e görev atama örneği
Java ExecutorService'in executive() yöntemi çalıştırılabilir bir nesneyi alır ve görevini eşzamansız olarak gerçekleştirir. Yürütme yöntemini çağırdıktan sonra, executorService'de diğer görevlerin sıraya girmesini engelleyen kapatma yöntemini çağırıyoruz.
public class ExecutorServiceExample { public static void main(String[] args) { ExecutorService executorService = Executors.newSingleThreadExecutor(); executorService.execute(new Runnable() { @Override public void run() { System.out.println('ExecutorService'); } }); executorService.shutdown(); } }
Çıktı:
ExecutorService
Submit() kullanarak ExecutorService'e görev atama örneği
submit() yöntemi çalıştırılabilir bir nesneyi alır ve bir Future nesnesi döndürür. Bu nesne daha sonra Runnable'ın yürütmeyi tamamlayıp tamamlamadığını kontrol etmek için kullanılır.
public class ExecutorServiceExample { public static void main(String[] args) { ExecutorService executorService = Executors.newSingleThreadExecutor(); executorService.submit(new Runnable() { @Override public void run() { System.out.println('ExecutorService'); } }); } }
invokeAny() yöntemini kullanarak ExecutorService'e görev atama örneği
java xor
invokeAny() yöntemi, Callable nesnelerinden veya Callable'ı uygulayan sınıf nesnelerinin bir koleksiyonunu alır. Bu yöntem, ilk önce başarıyla yürütülen çağrılabilir nesnenin gelecekteki nesnesini döndürür.
public class ExecutorServiceExample { public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService executorService = Executors.newSingleThreadExecutor(); Set<callable> callables = new HashSet<callable>(); callables.add(new Callable() { public String call() throws Exception { return 'Task 1'; } }); callables.add(new Callable() { public String call() throws Exception { return 'Task 2'; } }); callables.add(new Callable() { public String call() throws Exception { return 'Task 3'; } }); String result = executorService.invokeAny(callables); System.out.println('result = ' + result); executorService.shutdown(); } } </callable></callable>
Çıktı:
result = Task 1
Sonuç, ilk çağrılabilir nesnenin başarıyla yürütülmesi nedeniyle Görev 1'i depolar.
invokeAll() yöntemini kullanarak ExecutorService'e görev atama örneği
invokeAll() yöntemi, görevleri olan Çağrılabilir nesnelerin bir Koleksiyonunu alır ve tüm görevlerin sonucunu içeren Future nesnelerinin bir listesini döndürür.
public class ExecutorServiceExample { public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService executorService = Executors.newSingleThreadExecutor(); Set<callable> callables = new HashSet<callable>(); callables.add(new Callable() { public String call() throws Exception { return 'Task 1'; } }); callables.add(new Callable() { public String call() throws Exception { return 'Task 2'; } }); callables.add(new Callable() { public String call() throws Exception { return 'Task 3'; } }); java.util.List<future> futures = executorService.invokeAll(callables); for(Future future : futures){ System.out.println('future.get = ' + future.get()); } executorService.shutdown(); } } </future></callable></callable>
Çıktı:
future.get = Task 1 future.get = Task 3 future.get = Task 2
ExecutorService nasıl kapatılır
ExecutorService’e verdiğimiz görevlerimiz bitince onu kapatmak zorunda kalıyoruz çünkü ExecutorService görevi farklı thread’lerde gerçekleştiriyor. ExecutorService'i kapatmazsak iş parçacıkları çalışmaya devam edecek ve JVM kapanmayacaktır.
Kapatma işlemi aşağıdaki üç yöntemle yapılabilir:
- kapatma() yöntemi
- kapatmaŞimdi() yöntemi
- waitTermination() yöntemi