Javaプログラミング言語は非常に効率的に動作します タスクをスレッドで同時に実行する必要があるアプリケーション。アプリケーションが多数のスレッドを同時に実行することは困難になります。したがって、この問題を克服するには、 のサブインターフェイスであるExecutorServiceが付属しています 。この記事では、JavaでのExecutorServiceの機能について説明します。このブログで取り上げられているトピックは次のとおりです。
- エグゼキュータフレームワークとは何ですか?
- Javaの例でのExecutorService
- JavaExecutorServiceの実装
- ExecutorServiceの使用法
- 実行可能vs呼び出し可能
- ExecutorServiceのシャットダウン
エグゼキュータフレームワークとは何ですか?
1つまたは2つのスレッドを同時に作成して実行する方がかなり簡単です。しかし、スレッドの数がかなりの数に増えると、困難になります。大規模なマルチスレッドアプリケーションでは、数百のスレッドが同時に実行されます。したがって、アプリケーションでスレッドの作成とスレッドの管理を分離することは完全に理にかなっています。
遺言執行者は アプリケーションでスレッドを作成および管理するのに役立ちます。ザ・ 次のタスクで役立ちます。
スレッドの作成:アプリケーションを同時に実行するのに役立つスレッドを作成するためのさまざまな方法を提供します。
スレッド管理:スレッドのライフサイクルも管理します。タスクを実行のために送信する前に、スレッドがアクティブ、ビジー、またはデッドであるかどうかを心配する必要はありません。
タスクの送信と実行:エグゼキュータフレームワークは、スレッドプールでタスクを送信するためのメソッドを提供します。また、スレッドを実行するかどうかを決定する機能も提供します。
Javaの例でのExecutorService
これは、アプリケーションのスレッドライフサイクルを管理するための特定の機能を追加するエグゼキュータフレームワークのサブインターフェイスです。また、実行可能と呼び出し可能の両方を受け入れることができるsubmit()メソッドも提供します オブジェクト。
次の例では、単一のスレッドでExecutorServiceを作成し、スレッド内で実行するタスクを送信します。
import java.util.concurrent.ExecutorService import java.util.concurrent.Executors publicclass例{publicstatic void main(String [] args){System.out.println( 'Inside:' + Thread.currentThread()。getName( ))System.out.println( 'creating ExecutorService')ExecutorService executorservice = Executors.newSingleThreadExecutor()System.out.println( 'creating a runnable')Runnable runnable =()-> {System.out.println( 'inside: '+ Thread.currentThread()。getName())} System.out.println(' runnableによって指定されたタスクをexecutorserviceに送信します ')executorservice.submit(runnable)}}
出力: 内部:メイン作成ExecutorService実行可能ファイルの作成実行可能ファイルによって指定されたタスクを内部のexecutorserviceに送信します:pool-1-thread-1
上記 は、ExecutorServiceを作成し、エグゼキュータ内でタスクを実行する方法を示しています。タスクが実行のために送信され、スレッドが現在別のタスクの実行でビジー状態の場合、タスクはスレッドが自由に実行できるようになるまでキューで待機します。
上記のプログラムを実行すると、プログラムが終了することはありません。エグゼキュータサービスは新しいタスクをリッスンし続けるため、明示的にシャットダウンする必要があります。
JavaExecutorServiceの実装
ExecutorServiceは、スレッドプールと非常によく似ています。実際、java.util.concurrentでのExecutorServiceの実装 パッケージ スレッドプールの実装です。 ExecutorServiceには、java.util.concurrentパッケージに次の実装があります。
ThreadPoolExecutor
ThreadPoolExecutorは、内部でプールされたスレッドの1つを使用して、指定されたタスクを実行します。
threadPoolExecutorの作成
int corePoolSize = 5 int maxPoolSize = 10 long keepAliveTime = 5000 ExecutorService threadPoolExecutor = new threadPoolExecutor(corePoolSize、maxPoolSize、keepAliveTime、TimeUnit.MILLISECONDS、new LinkedBlockingQueue())
ScheduledThreadPoolExecutor
java.util.concurrent.ScheduledThreadPoolExecutorは、タスクを遅延後に実行するようにスケジュールしたり、各実行の間に一定の時間間隔で繰り返し実行したりできるExecutorServiceです。
例
ScheduledExecutorServicecheduledexecutorservice = Executors.newScheduledThreadPool(5)ScheduledFuturecheduledfuture = cheduledExecutorService.schedule(new Callable(){public Object call()throws Exception {System.out.println( 'executed')return'called '}}、5、TimeUnit。秒)
ExecutorServiceの使用法
タスクをExecutorServiceに委任する方法はいくつかあります。
execute(実行可能)
送信(実行可能)
invokeAny()
invokeAll()
Runnableを実行する
Java ExecutorService execute(Runnable)は、java.lang.Runnableオブジェクトを受け取り、非同期で実行します。
ExecutorService executorService = Executors.newSingleThreadExecutor()executorService.execute(new Runnable(){public void run(){System.out.println( 'asynchronous task')}})executorService.shutdown()
Runnableの実行結果を取得する方法はありません。そのため、Callableを使用する必要があります。
Runnableを送信する
Java ExecutorService submit(Runnable)メソッドは、Runnable実装を受け取り、futureオブジェクトを返します。 futureオブジェクトを使用して、Runnableの実行が終了したかどうかを確認できます。
Future future = executorService.submit(new Runnable(){public void run(){System.out.println(:asynchronous task ')}})future.get()//タスクが正しく終了した場合はnullを返します。
Callableを送信
Java ExecutorServiceのsubmit(Callable)メソッドはsubmit(Runnable)に似ていますが、RunnableではなくJavaCallableを使用します。
Future future = executorService.submit(new Callable(){public Object call()throws Exception {System.out.println( 'Asynchronous callable')return'Callable Result '}})System.out.println(' future.get( ' )= 'future.get())
出力: 非同期の呼び出し可能なfuture.get =呼び出し可能な結果
invokeAny()
invokeAny()メソッドは、Callableオブジェクトのコレクションを取ります。このメソッドを呼び出すと、futureは返されませんが、Callableオブジェクトの1つの結果が返されます。
ExecutorService executorService = Executors.newSingleThreadExecutor()セットcallables =新しいHashSet ()callables.add(new Callable(){public String call()throws Exception {return'task A '}})callables.add(new Callable(){public String call()throws Exception {return'task B'} })callables.add(new Callable(){public String call()throws Exception {return'task C '}})String result = executorService.invokeAny(callables)System.out.println(' result = '+ result)executorService 。シャットダウン()
上記のコードを実行すると、結果が変わります。タスクA、タスクBなどの場合があります。
InvokeAll()
invokeAll()メソッドは、パラメーターとして渡されたすべてのCallableオブジェクトを呼び出します。各Callableの実行結果を取得するために使用できるfutureオブジェクトを返します。
ExecutorService executorService = Executors.newSingleThreadExecutor()セットcallables =新しいHashSet ()callables.add(new Callable(){public String call()throws Exception {return'Task A '}})callables.add(new Callable(){public String call()throws Exception {return'Task B'} })callables.add(new Callable(){public String call()throws Exception {return'Task C '}})リスト futures = executorService.invokeAll(callables)for(Future future:futures){System.out.println( 'future.get =' + future.get())} executorService.shutdown()
実行可能vs呼び出し可能
実行可能インターフェースと呼び出し可能インターフェースは互いに非常に似ています。違いは、の宣言に表示されます インターフェイス。 両方のインターフェースは、スレッドまたはExecutorServiceによって同時に実行できるタスクを表します。
呼び出し可能な宣言:
パブリックインターフェイスCallable {パブリックオブジェクトcall()は例外をスローします}
実行可能な宣言:
パブリックインターフェイスRunnable {public void run()}
2つの主な違いは、call()メソッドがメソッド呼び出しからオブジェクトを返すことができることです。そしてcall()メソッドは run()メソッドはできませんが。
ランダムな文字列javaを生成します
タスクをキャンセルする
ExecutorServiceに送信されたタスクは、タスクの送信時に送信される将来のキャンセルメソッドを呼び出すだけでキャンセルできます。
future.cancel()
ExecutorServiceのシャットダウン
実行が完了した後でもスレッドが実行されないようにするには、ExecutorServiceをシャットダウンする必要があります。
シャットダウン()
ExecutorService内のスレッドを終了するには、shutdown()メソッドを呼び出すことができます。
executorService.shutdown()
これでこの記事の終わりになり、ExecutorServiceを使用してスレッドでタスクを実行する方法を学びました。このチュートリアルで共有されているすべてのことを明確に理解していただければ幸いです。
「JavaのExecutorService」に関するこの記事が関連していると感じた場合は、 25万人以上の満足した学習者のネットワークを持つ信頼できるオンライン学習会社が世界中に広がっています。
私たちはあなたの旅のすべてのステップであなたを助け、Java開発者になりたい学生や専門家のために設計されたカリキュラムを考え出すためにここにいます。このコースは、Javaプログラミングをすぐに開始できるように設計されており、さまざまなJavaのコア概念と高度な概念の両方についてトレーニングします。 お気に入り Hibernate & 。
ご不明な点がございましたら、「JavaのExecutorService」のコメントセクションでお気軽にご質問ください。喜んでお答えいたします。