jdk1.7.0_79
前回の記事「ThreadPoolExecutorのスレッドプールの原理とその実行メソッド」で、スレッドプールThreadPoolExecutorの原理とその実行メソッドについて触れました。この記事では ThreadPoolExecutor#submit を分析します。
タスクの実行では、結果を返す必要がない場合もありますが、実行結果を返す必要があります。スレッドの場合、結果を返す必要がない場合は Runnable を実装でき、結果を実行する必要がある場合は Callable を実装できます。スレッド プールでは、execute は結果を返す必要のないタスクの実行も提供し、結果を返す必要があるタスクに対してその submit メソッドを呼び出すことができます。
ThreadPoolExecutorの継承関係を見直してください。
Executorインターフェースにはexecuteメソッドのみが定義されており、ExecutorServiceインターフェースにはsubmitメソッドが定義されています。
//ExecutorServicepublic interface ExecutorService extends Executor { ... <t> Future<t> submit(Callable<t> task); <t> Future<t> submit(Runnable task, T result); <t> Future<t> submit(Runnable task); ... }</t></t></t></t></t></t></t>
そしてsubmitメソッドはそのサブクラスAbstractExecutorServiceに実装されています。
//AbstractExecutorServicepublic abstract class AbstractExecutorService implements ExecutorService { ... public <t> Future<t> submit(Callable<t> task) { if (task == null) throw new NullPointerException(); RunnableFuture<t> ftask = newTaskFor(task); execute(ftask); return ftask; } public <t> Future<t> submit(Runnable task, T result) { if (task == null) throw new NullPointerException(); RunnableFuture<t> ftask = newTaskFor(task); execute(ftask); return ftask; } public Future> submit(Runnable task) { if (task == null) throw new NullPointerExeption(); RunnableFuture<void> ftask = newTaskFor(task, null); execute(ftask); return ftask; } ... }</void></t></t></t></t></t></t></t>
AbstractExecutorServiceに実装されているsubmitメソッドは、実際にはsubmitメソッドのアルゴリズム骨格を定義するテンプレートメソッドであり、その実行はサブクラスに渡されます。 (多くのソースコードでテンプレートメソッドのパターンが広く使われていることが分かります。テンプレートメソッドのパターンについては「テンプレートメソッドのパターン」を参照してください。)
submitメソッドはスレッド実行の戻り値を提供できますが、 Callable が実装されている場合にのみ戻り値が返され、Runnable を実装するスレッドには戻り値がありません。つまり、上記の 3 つのメソッドのうち、submit(Callable
submit メソッドの雰囲気をつかむために、以下に 3 つの例を示します。
submit(呼び出し可能な
package com.threadpoolexecutor;import java.util.concurrent.*;/** * ThreadPoolExecutor#sumit(Callable<t> task) * Created by yulinfeng on 6/17/17. */public class Sumit1 {public static void main(String[] args) throws ExecutionException, InterruptedException { Callable<string> callable = new Callable<string>() {public String call() throws Exception { System.out.println("This is ThreadPoolExetor#submit(Callable<t> task) method.");return "result"; } }; ExecutorService executor = Executors.newSingleThreadExecutor(); Future<string> future = executor.submit(callable); System.out.println(future.get()); } }</string></t></string></string></t>
submit(実行可能なタスク、Tの結果)
package com.threadpoolexecutor;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;/** * ThreadPoolExecutor#submit(Runnable task, T result) * Created by yulinfeng on 6/17/17. */public class Submit2 {public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService executor = Executors.newSingleThreadExecutor(); Data data = new Data(); Future<data> future = executor.submit(new Task(data), data); System.out.println(future.get().getName()); } }class Data { String name;public String getName() {return name; }public void setName(String name) {this.name = name; } }class Task implements Runnable { Data data;public Task(Data data) {this.data = data; }public void run() { System.out.println("This is ThreadPoolExetor#submit(Runnable task, T result) method."); data.setName("kevin"); } }</data>
submit(R不可能なタスク)
package com.threadpoolexecutor;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;/** * ThreadPoolExecutor#sumit(Runnable runnables) * Created by yulinfeng on 6/17/17. */public class Submit {public static void main(String[] args) throws ExecutionException, InterruptedException { Runnable runnable = new Runnable() {public void run() { System.out.println("This is ThreadPoolExetor#submit(Runnable runnable) method."); } }; ExecutorService executor = Executors.newSingleThreadExecutor(); Future future = executor.submit(runnable); System.out.println(future.get()); } }
上記の例から、submit(Runnable runnable) を呼び出す場合、定義された型は必要ないことがわかります。つまり、ExecutorService で定義されたジェネリック メソッドですが、AbstractExecutorService ではジェネリック メソッドではありません。戻り値はありません。 (Object、T、?の違いについては「JavaのObject、T(ジェネリック)、?の違い」を参照してください。)
上記のソースコードを見ると、これら 3 つのメソッドがほぼ同じであることがわかります。鍵となるのは、
RunnableFuture<t> ftask = newTaskFor(task); execute(ftask);</t>
タスクをパラメータとして newTaskFor に渡し、execute メソッドを呼び出し、最後に ftask を返す方法です。どうですか?
//AbstractExecutorService#newTaskForprotected <t> RunnableFuture<t> newTaskFor(Callable<t> callable) { return new FutureTask<t>(callable); } protected <t> RunnableFuture<t> newTaskFor(Runnable runnable, T value) { return new FutureTask<t>(runnable, value); }</t></t></t></t></t></t></t>
FutureTaskインスタンスが返されるようで、FutureTaskはFutureインターフェースとRunnableインターフェースを実装しています。 Future インターフェイスは、非同期計算に使用できる Java スレッド Future モードの実装です。Runnable インターフェイスを実装すると、スレッドとして実行できるようになります。 FutureTask はこれら 2 つのインターフェイスを実装しています。これは、非同期計算の結果を表し、実行用のスレッドとして Executor に渡すことができることを意味します。 FutureTask については、次の章で個別に分析します。したがって、この記事のスレッド プール ThreadPoolExecutor スレッド プールの submit メソッドの分析は完了していません。Java スレッドの Future モード (「14. Java の Future モード」) を理解する必要があります。
以上がThreadPoolExecutor スレッド プールの Submit メソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

この記事では、Javaプロジェクト管理、自動化の構築、依存関係の解像度にMavenとGradleを使用して、アプローチと最適化戦略を比較して説明します。

この記事では、MavenやGradleなどのツールを使用して、適切なバージョン化と依存関係管理を使用して、カスタムJavaライブラリ(JARファイル)の作成と使用について説明します。

この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

この記事では、キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPAを使用することについて説明します。潜在的な落とし穴を強調しながら、パフォーマンスを最適化するためのセットアップ、エンティティマッピング、およびベストプラクティスをカバーしています。[159文字]

Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します

この記事では、分散アプリケーションを構築するためのJavaのリモートメソッドの呼び出し(RMI)について説明します。 インターフェイスの定義、実装、レジストリのセットアップ、およびクライアント側の呼び出しを詳述し、ネットワークの問題やセキュリティなどの課題に対処します。

この記事では、ネットワーク通信のためのJavaのソケットAPI、クライアントサーバーのセットアップ、データ処理、リソース管理、エラー処理、セキュリティなどの重要な考慮事項をカバーしています。 また、パフォーマンスの最適化手法も調査します

この記事では、カスタムJavaネットワーキングプロトコルの作成を詳述しています。 プロトコルの定義(データ構造、フレーミング、エラー処理、バージョン化)、実装(ソケットを使用)、データシリアル化、およびベストプラクティス(効率、セキュリティ、メンテナ


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

Dreamweaver Mac版
ビジュアル Web 開発ツール

メモ帳++7.3.1
使いやすく無料のコードエディター
