Java'da ExecutorService nedir ve nasıl oluşturulur?

Bu makale, Java'da iş parçacığı oluşturma ve yönetimini açıklamak için Java'da Executor alt arabirimi ExecutorService kavramını çeşitli örneklerle kapsamaktadır.

Java programlama dili ile çok verimli çalışır Görevlerin bir iş parçacığında eşzamanlı olarak yürütülmesini gerektiren uygulamalar. Herhangi bir uygulamanın aynı anda çok sayıda iş parçacığı yürütmesi zorlaşır. Yani bu sorunun üstesinden gelmek için, bir alt arabirim olan ExecutorService ile birlikte gelir. . Bu makalede, ExecutorService'in Java'daki işlevselliğini tartışacağız. Bu blogda ele alınan konular şunlardır:



Executor Framework nedir?

Bir veya iki iş parçacığını aynı anda yapmak ve yürütmek oldukça kolaydır. Ancak iş parçacığı sayısı önemli bir sayıya çıktığında zorlaşır. Büyük çok iş parçacıklı uygulamalarda aynı anda çalışan yüzlerce iş parçacığı olacaktır. Bu nedenle, bir uygulamada iş parçacığı oluşturmayı iş parçacığı yönetiminden ayırmak tamamen mantıklıdır.



Cellat bir bir uygulamada iş parçacığı oluşturmanıza ve yönetmenize yardımcı olur. aşağıdaki görevlerde size yardımcı olur.

  • İş Parçacığı Oluşturma: Uygulamalarınızın eşzamanlı olarak çalıştırılmasına yardımcı olan iş parçacığı oluşturmak için çeşitli yöntemler sağlar.



  • İş Parçacığı Yönetimi: İş parçacığı yaşam döngüsünü de yönetir. Görevi yürütme için göndermeden önce iş parçacığının aktif, meşgul veya çalışmadığından endişelenmenize gerek yok.

  • Görev Gönderme ve Yürütme: Yürütme çerçevesi, iş parçacığı havuzunda görev gönderimi için yöntemler sağlar, ayrıca iş parçacığının çalıştırılıp çalıştırılmayacağına karar verme gücü verir.

java -edureka

Java Örneğinde ExecutorService

Bir uygulamanın iş parçacığı yaşam döngüsünü yönetmek için belirli işlevler ekleyen yürütme çerçevesinin bir alt arayüzüdür. Ayrıca, hem çalıştırılabilir hem de çağrılabilir kabul edebilen bir submit () yöntemi sağlar nesneler.



Aşağıdaki örnekte, tek bir iş parçacığı ile bir ExecutorService oluşturacağız ve ardından iş parçacığı içinde yürütülecek görevi göndereceğiz.

import java.util.concurrent.ExecutorService import java.util.concurrent.Executors genel sınıfı Örnek {public static void main (String [] args) {System.out.println ('Inside:' + Thread.currentThread (). getName ( )) System.out.println ('ExecutorService') ExecutorService executorservice = Executors.newSingleThreadExecutor () System.out.println ('bir çalıştırılabilir oluşturma') Runnable runnable = () -> {System.out.println ('içinde: '+ Thread.currentThread (). GetName ())} System.out.println (' çalıştırılabilir tarafından belirtilen görevi yürütme hizmetine gönderin ') executorservice.submit (runnable)}}
 Çıktı: İçeride: ana oluşturma ExecutorService bir çalıştırılabilir yaratma, çalıştırılabilir tarafından belirtilen görevi içindeki yürütücü hizmete gönderin: pool-1-thread-1

Yukarıdaki bir ExecutorService'i nasıl oluşturabileceğimizi ve yürütücünün içinde bir görevi nasıl yürütebileceğimizi gösterir. Bir görev yürütülmek üzere gönderildiyse ve iş parçacığı şu anda başka bir görevi yürütmekle meşgulse, iş parçacığı onu yürütmek için serbest olana kadar görev bir kuyrukta bekleyecektir.

Yukarıdaki programı çalıştırdığınızda, program asla çıkmayacaktır. Yürütme hizmeti yeni görevleri dinlemeye devam ettiği için bunu açıkça kapatmanız gerekecektir.

Java ExecutorService Uygulamaları

ExecutorService, iş parçacığı havuzuna çok benzer. Aslında, ExecutorService'in java.util.concurrent paket bir threadpool uygulamasıdır. ExecutorService, java.util.concurrent paketinde aşağıdaki uygulamalara sahiptir:

ThreadPoolExecutor

ThreadPoolExecutor, verilen görevleri dahili olarak havuzlanmış iş parçacıklarından birini kullanarak yürütür.

ThreadPoolExecutor oluşturma

int corePoolSize = 5 int maxPoolSize = 10 uzun keepAliveTime = 5000 ExecutorService threadPoolExecutor = new threadPoolExecutor (corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.MILLISECONDS, new LinkedBlockingQueue ())

ScheduledThreadPoolExecutor

Java.util.concurrent.ScheduledThreadPoolExecutor, görevleri bir gecikmeden sonra çalışacak veya her yürütme arasında sabit bir zaman aralığı ile tekrar tekrar çalıştırılacak şekilde zamanlayabilen bir ExecutorService'dir.

Misal

ScheduledExecutorService schedexecutorservice = Executors.newScheduledThreadPool (5) ScheduledFuture schedfuture = schedExecutorService.schedule (new Callable () {public Object call () '}}, 5, TimeUnit adlı Exception {System.out.println (' çalıştırıldı ') dönüşü' atar. SANİYE)

ExecutorService Kullanımı

Bir ExecutorService'e görevleri devretmenin birkaç farklı yolu vardır.

  • yürütmek (Çalıştırılabilir)

  • gönder (Çalıştırılabilir)

  • invokeAny ()

  • invokeAll ()

Runnable'ı Yürüt

Java ExecutorService execute (Runnable) bir java.lang.Runnable nesnesini alır ve eşzamansız olarak çalıştırır.

ExecutorService executorService = Executors.newSingleThreadExecutor () executorService.execute (new Runnable () {public void run () {System.out.println ('asynchronous task')}}) executorService.shutdown ()

Runnable'ı çalıştırmanın sonucunu almanın bir yolu yoktur, çünkü Callable'ı kullanmanız gerekir.

Runnable'ı Gönder

Java ExecutorService submit (Runnable) yöntemi bir Runnable uygulamasını alır ve gelecekteki bir nesneyi döndürür. Gelecek nesne, Runnable'ın yürütmeyi bitirip bitirmediğini kontrol etmek için kullanılabilir.

Future future = executorService.submit (new Runnable () {public void run () {System.out.println (: asynchronous task ')}}) future.get () // görev doğru şekilde tamamlanırsa null döndürür.

Çağrılabilir Gönder

Java ExecutorService submit (Çağrılabilir) yöntemi submit (Çalıştırılabilir) yöntemine benzer, ancak Runnable yerine Java Çağrılabilir'i alır.

Future future = executorService.submit (new Callable () {public Object call () Exception atar {System.out.println ('Asynchronous callable') return 'Callable Result'}}) System.out.println ('future.get ( ) = 'future.get ())
 Çıktı: Asynchroous callable future.get = Çağrılabilir Sonuç

invokeAny ()

İnvokeAny () yöntemi, Callable nesnelerin bir koleksiyonunu alır. Bu yöntemi çağırmak herhangi bir gelecek döndürmez, ancak Çağrılabilir nesnelerden birinin sonucunu döndürür.

ExecutorService executorService = Executors.newSingleThreadExecutor () Setcallables = yeni HashSet() callables.add (new Callable () {public String call (), Exception {returnask A '}} atar) callables.add (new Callable () {public String call (), Exception {returnask B'} atar }) callables.add (new Callable () {public String call (), Exception {returnask C '}} atar) String sonucu = executorService.invokeAny (çağrılabilirler) System.out.println (' sonuç = '+ sonuç) executorService .kapat()

Yukarıdaki kodu çalıştırdığınızda sonuç değişir. Görev A, Görev B ve benzeri olabilir.

InvokeAll ()

İnvokeAll () yöntemi, parametre olarak iletilen tüm Çağrılabilir nesneleri çağırır. Her Çağrılabilir'in yürütülmesinin sonuçlarını almak için kullanılabilecek gelecekteki nesneleri döndürür.

ExecutorService executorService = Executors.newSingleThreadExecutor () Setcallables = yeni HashSet() callables.add (new Callable () {public String call (), Exception {return 'Task A'}}) callables.add (new Callable () {public String call (), Exception {return 'Task B'} atar} }) callables.add (new Callable () {public String call () Exception atar {return 'Task C'}}) Listefutures = executorService.invokeAll (callables) for (Future future: futures) {System.out.println ('future.get =' + future.get ())} executorService.shutdown ()

Runnable vs Callable

Çalıştırılabilir ve çağrılabilir arayüzler birbirine çok benzer. Aradaki fark, arayüzler. Her iki arabirim de bir iş parçacığı veya ExecutorService tarafından eşzamanlı olarak yürütülebilen bir görevi temsil eder.

Çağrılabilir Beyan:

genel arayüz Çağrılabilir {genel nesne çağrısı () İstisna atar}

Runnable Beyanı:

genel arayüz Çalıştırılabilir {public void run ()}

İkisi arasındaki temel fark, call () yönteminin, yöntem çağrısından bir nesne döndürebilmesidir. Ve call () yöntemi bir run () yöntemi ise yapamaz.

angularjs'de açılır menü

görevi iptal et

ExecutorService'e gönderilen görevi, görev gönderildiğinde gönderilecek olan ileride iptal yöntemini arayarak iptal edebilirsiniz.

Future.cancel ()

Yürütme Hizmeti Kapatma

İşlem tamamlandıktan sonra bile iş parçacıklarının çalışmasını engellemek için, ExecutorService'i kapatmalısınız.

kapat()

Bir ExecutorService içindeki iş parçacıklarını sonlandırmak için shutdown () yöntemini çağırabilirsiniz.

executorService.shutdown ()

Bu bizi, bir iş parçacığındaki görevleri yürütmek için ExecutorService'i nasıl kullanabileceğimizi öğrendiğimiz bu makalenin sonuna getiriyor. Umarım bu eğitimde sizinle paylaşılan her şeyden eminsinizdir.

Bu makaleyi 'Java'da ExecutorService' ile ilgili bulduysanız, Dünya çapında 250.000'den fazla memnun öğrenciden oluşan bir ağa sahip güvenilir bir çevrimiçi öğrenim şirketi.

Yolculuğunuzun her adımında size yardımcı olmak ve Java Geliştiricisi olmak isteyen öğrenciler ve profesyoneller için tasarlanmış bir müfredat oluşturmak için buradayız. Kurs, size Java programlamasına bir başlangıç ​​yapmak ve sizi hem temel hem de gelişmiş Java kavramlarının yanı sıra çeşitli konularda eğitmek için tasarlanmıştır. sevmek Hazırda beklet & .

Herhangi bir sorunuz olursa, tüm sorularınızı “Java'da ExecutorService” in yorumlar bölümünde sormaktan çekinmeyin, ekibimiz cevaplamaktan mutluluk duyacaktır.