Javaで呼び出し可能なインターフェースを実装する方法



この記事では、JavaでCallableInterfaceを実装する方法の詳細で包括的な知識を例とともに提供します。

Javaマルチスレッドプログラムは、広範な使用を目撃します 呼び出し可能で未来。スレッドとマルチスレッドの前提知識の下で、読者はこの記事の議論をよりよく理解できるようになります。この記事では、JavaのCallableInterfaceについて説明します。

スレッドの要約

ただし、スレッドの概念について簡単に紹介します。スレッドは個別の実行パスです。繰り返しタスクを実行する必要がある場合は、作業を複数のタスクに分割してスレッドに割り当てることができます。マルチスレッド複数のスレッドを割り当てて異なるタスクを並行して実行し、結果をすばやく取得することに他なりません。





Javaで呼び出し可能なインターフェイスとは

Java 5では、クラス「java.util.concurrent」が導入されました。この呼び出し可能なインターフェイスは、Runnableインターフェイスに似た同時実行パッケージを介して導入されました。また、任意のオブジェクトを返すことができ、例外をスローすることができます。 Java CallableインターフェースはGenericsを使用するため、あらゆるタイプのオブジェクトを返すことができます。 Executor Frameworkは、スレッドのプールでCallable実装を実行するためのsubmit()メソッドを提供します。実際には、Java ExecutorFrameworkはWorkerThreadパターンに準拠しています。

java-interfaceスレッドプールでは、ユーザーはExecutors.newFixedThreadPool(10)メソッドを使用してスレッドを開始し、それに応じてタスクを送信できます。ランナブルはスレッドのターゲットとして機能し、パブリックvoid run()メソッドはタスクを定義するために強制的に実装されます。これは、スレッドプール内のスレッドによって実行されます。プール内のスレッドの可用性に基づいて、Executor Frameworkは作業(実行可能なターゲット)をスレッドに割り当てます。すべてのスレッドが使用中の場合、タスクを停止する必要があります。スレッドが1つのタスクを完了すると、使用可能なスレッドとしてプールに戻り、将来のタスクを受け入れる準備が整います。 CallableはRunnableに似ており、タスクから結果またはステータスを取得するときに、任意のタイプのオブジェクトを返すことができます。



ジャストインタイムコンパイラjava

呼び出し可能なインターフェースの返却

JavaCallableはjava.util.concurrentを返します。 Java Futureは、関連するCallableタスクを排除するためのcancel()メソッドを提供します。これは、get()メソッドのオーバーロードバージョンであり、結果を待つ特定の時間を指定できます。長期間ブロックされる可能性のある現在のスレッドを回避すると便利です。 getメソッドは同期メソッドであり、callableがタスクを終了して値を返すまで、callableを待機する必要があることに注意してください。

関連するCallableタスクの現在のステータスをフェッチするための「isDone()」および「isCancelled()」メソッドもあります。 1から100までのすべての数値の合計を見つける必要がある例を考えてみましょう。 1から100を順番にループし、最後に追加することができます。別の可能性は分割統治法です。この方法では、各グループが正確に2つの要素を持つように番号をグループ化できます。最後に、そのグループをスレッドのプールに割り当てることができます。したがって、各スレッドは部分的な合計を並列に返し、それらの部分的な合計を収集して加算し、全体の合計を取得します。



呼び出し可能クラスと将来のクラスの機能

  • 呼び出し可能なクラスはSAMタイプのインターフェースであるため、ラムダ式で実装できます。

  • 呼び出し可能クラスには、非同期で実行するために必要なすべてのコードを保持するメソッド「call()」が1つだけあります。

  • 実行可能なインターフェイス環境では、計算結果を返したり、チェックされた例外をスローしたりすることはできませんでした。一方、Callableを使用すると、値を返し、チェックされた例外をスローできます。

  • 計算が完了すると、FutureクラスのGet()メソッドを使用して結果を取得できます。また、done()メソッドを使用して、計算が終了したかどうかを確認することもできます。

  • future.cancel()メソッドを使用して計算をキャンセルすることも、一部のアプリケーションではメリットがあります。

  • Get()はブロッキング呼び出しと呼ばれ、計算が完了するまでブロックを続けます。

呼び出し可能クラスと実行可能クラスの比較

呼び出し可能 実行可能
それは「 java.util.concurrent ' Java1.5以降のパッケージこれは、Java1.0以降のjava.langパッケージの一部です。
Callableなどのパラメータ化されたインターフェイスパラメータ化されていないインターフェイス
チェックされた例外をスローすることができますチェックされた例外をスローすることはできません
これには、タイプVを返す単一のメソッドcall()が含まれています。これは、定義されたインターフェイスパラメータ「Type」と同じです。ここでは、voidを返すrun()と呼ばれる単一のメソッドが含まれています

以下は、コードが1秒後にタスクを実行している特定のスレッドの名前を返す、実装されたJava呼び出し可能クラスの簡単な例です。ここでは、エクストラクタフレームワークを利用して、送信されたタスクの結果に対してJavaFutureと並行して100個のタスクを実行します。最初のスニペットは出力であり、以下はコードを表しています。

パッケージcom.journaldev.threadsimport java.util.ArrayList import java.util.Date import java.util.List import java.util.concurrent.Callable import java.util.concurrent.ExecutionException import java.util.concurrent.ExecutorService import java .util.concurrent.Executors import java.util.concurrent.Future public class MyCallableimplements Callable {@Override public String call()throws Exception {Thread.sleep(1000)//この呼び出し可能なタスクを実行するスレッド名を返すreturn Thread.currentThread ().getName()} public static void main(String args []){// ExecutorsユーティリティクラスからExecutorServiceを取得し、スレッドプールサイズは10ですExecutorService executor = Executors.newFixedThreadPool(10)// Futureを保持するリストを作成します呼び出し可能リストに関連付けられたオブジェクトリスト=新しいArrayList()// MyCallableインスタンスを作成するCallablecallable = new MyCallable()for(int i = 0 i<100 i++){ //submit Callable tasks to be executed by thread pool Future future = executor.submit(callable) //add Future to the list, we can get return value using Future list.add(future) } for(Future fut : list){ try { //print the return value of Future, notice the output delay in console // because Future.get() waits for task to get completed System.out.println(new Date()+ '::'+fut.get()) } catch (InterruptedException | ExecutionException e) { e.printStackTrace() } } //shut down the executor service now executor.shutdown() } } 

エグゼキュータサービスのシャットダウン

多くの開発者が見逃している重要で重要な側面は、ExecutorServiceをシャットダウンすることです。 ExecutorServiceは不可欠であり、追加のスレッド要素を使用して作成されます。 JVMは、デーモン以外のすべてのスレッドが停止した場合にのみ停止することに注意してください。したがって、エグゼキュータサービスをシャットダウンするだけで、JVMが停止するのを防ぐことができます。

スレッドを実行する必要がないことをエグゼキュータサービスに通知するには、サービスをシャットダウンする必要があります。

シャットダウンを呼び出すには、次の3つの方法があります。

  • void shutdown() –これにより、以前に送信されたタスクが実行されるが、新しいタスクは受け入れられない、正常なシャットダウンが開始されます。
  • リストshutdownNow() –アクティブに実行されているすべてのタスクを停止しようとし、保留中のタスクの処理を停止し、実行を待機していたタスクのリストも返します。
  • void awaitTermination() –これは、シャットダウン要求後にすべてのタスクの実行が終了するか、タイムアウトが発生するまでブロックを続けます。また、現在のスレッドが中断されたときにもブロックします。すべては、どのタスクが最初に来るかに依存します。

これで、JavaのCallableInterfaceの記事は終わりです。 JavaのFutureand CallableInterfaceについて理解していただければ幸いです。

チェックしてください 25万人以上の満足した学習者のネットワークを持つ信頼できるオンライン学習会社であるEdurekaが世界中に広がっています。 EdurekaのJavaJ2EEおよびSOAトレーニングおよび認定コースは、Java開発者になりたい学生および専門家向けに設計されています。

質問がありますか?この「Javaで呼び出し可能なインターフェイス」ブログのコメントセクションにその旨を記載してください。できるだけ早くご連絡いたします。