この記事では、主に Java Executor フレームワークの例の詳細な説明に関する関連情報を紹介します。ここでは、この部分の内容を学習して理解するのに役立つ例を提供します。
例の詳細な説明。 Java Executor フレームワークの
ほとんどの同時実行性はすべてタスクの実行によって実現されます。
タスクを実行するには、通常、シリアルとパラレルの 2 つの方法があります。
class SingleThreadWebServer { public static void main(String[] args) throws Exception { ServerSocket socket = new ServerSocket(80); while(true) { Socket conn = socket.accept(); handleRequest(conn); } } } class ThreadPerTaskWebServer { public static void main(String[] args) throws Exception { ServerSocket socket = new ServerSocket(80); while(true) { final Socket conn = socket.accept(); Runnable task = new Runnable() { public void run() { handleRequest(conn); } }; new Thread(task).start(); } } }
もちろん、上記のどちらの方法にも問題があります。シングルスレッドの問題は、マルチスレッドバージョンでは同時実行の量がボトルネックとなり、無制限にスレッドを作成するとリソースが不足してしまうことです。
Executor Framework
タスクは一連の論理的な作業単位であり、スレッドはタスクを非同期に実行できるようにするメカニズムです。
JDK は Executor インターフェイスを提供します:
public interface Executor { void execute(Runnable command); }
Executor インターフェイスは比較的単純ですが、これは非同期タスク実行フレームワークの基礎であり、さまざまなタイプのタスク実行戦略をサポートできます。これは、タスク送信プロセスを実行プロセスから分離する標準的な方法を提供します。 Runnable を使用してタスクを表現します。 Executor の実装により、ライフサイクル サポートや統計アプリケーション管理などのメカニズムが提供されます。
Executor は、プロデューサー/コンシューマー モデルに基づいており、タスクを送信する操作はプロデューサーに相当し、タスクを実行するスレッドはコンシューマーに相当します。
Executor ベースの WebServer の例は次のとおりです:
public class TaskExecutorWebServer { private static final int NTHREADS = 100; private static final Executor exec = Executors.newFixedThreadPool(NTHREADS); public static void main(String[] args) throws Exception { ServerSocket serverSocket = new ServerSocket(80); while (true) { final Socket conn = serverSocket.accept(); Runnable task = new Runnable() { @Override public void run() { handleRequest(conn); } }; exec.execute(task); } } }
さらに、次のコードのように Executor を自分で実装して、同時か並列かを制御することもできます:
/** * 执行已提交的 Runnable 任务的对象。 * 此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方法。 * 通常使用 Executor 而不是显式地创建线程。 * * * @author renchunxiao * */ public class ExecutorDemo { public static void main(String[] args) { Executor executor = new ThreadExecutor(); executor.execute(new Runnable() { @Override public void run() { // do something } }); Executor executor2 = new SerialExecutor(); executor2.execute(new Runnable() { @Override public void run() { // do something } }); } } /** * 创建一个线程来执行 command * * @author renchunxiao * */ class ThreadExecutor implements Executor { @Override public void execute(Runnable command) { new Thread(command).start(); } } /** * 串行执行 command * * @author renchunxiao * */ class SerialExecutor implements Executor { @Override public void execute(Runnable command) { command.run(); } }
スレッド プール
スレッド プールはスレッド プールのリソースであり、Executor の静的ファクトリ メソッドを通じてスレッド プールを作成できます。
新しい固定スレッドプール。固定長のスレッド プールを作成し、スレッド プールの最大数に達するまで、タスクが送信されるたびにスレッドを作成します。
新しいSingleThreadExecutor。シングルスレッドプール。
新しいキャッシュされたスレッドプール。タスクのサイズに応じて拡張するスレッド プール。
新しいスケジュールされたスレッドプール。固定長のスレッド プールを作成して、タスクを遅延または時間指定して実行します。
JVM は、すべての非デーモン スレッドが終了した後にのみ終了します。そのため、Executor を正しく閉じることができない場合、JVM は終了できません。
実行サービスのライフサイクル問題を解決するために、Executor インターフェイスを拡張する新しいインターフェイス ExecutorService があります。
public interface ExecutorService extends Executor { void shutdown(); List<Runnable> shutdownNow(); boolean isShutdown(); boolean isTerminated(); boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException; <T> Future<T> submit(Callable<T> task); <T> Future<T> submit(Runnable task, T result); Future<?> submit(Runnable task); <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException; <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException; <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException; <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; }
ExecutorService ライフサイクルには、実行中、クローズ済み、終了済みの 3 つの状態があります。 ExecutorService は、最初に作成されたときに実行されています。 shutdown メソッドは正常にシャットダウンします。新しいタスクは受け入れられなくなり、既に実行されたタスク (まだ開始されていないタスクを含む) が完了するまで待機します。 shutdownNow メソッドは、大まかなシャットダウンを実行します。実行中のすべてのタスクのキャンセルを試行し、キュー内のまだ開始されていないタスクは開始しません。すべてのタスクが完了すると、終了状態になります。
Callable と Future
Executor フレームワークは、基本的なタスク表現として Runnable を使用します。 Runnable は、run メソッドが値を返すことができず、チェック例外をスローするという点で、限定された抽象化です。
データベースのクエリやネットワークからのリソースの取得など、多くのタスクは実際には遅延を伴う計算です。これらのタスクでは、Callable の方が優れた抽象化であり、呼び出しが値を返し、例外をスローする可能性があることを前提としています。
Executor によって実行されるタスクには、作成、送信、開始、完了という 4 つのライフサイクル ステージがあります。一部のタスクには時間がかかり、キャンセルが必要になる場合があるため、Executor フレームワークでは、送信されたものの開始されていないタスクをキャンセルできます。
Future はタスクのライフサイクルを表し、タスクが完了したかキャンセルされたかを判断したり、タスクの結果を取得したりタスクをキャンセルしたりするための対応するメソッドを提供します。
以上がJava の Executor フレームワークの例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

Javaプロジェクトを実行可能なJARファイルにパッケージ化すると、noclassdeffounderrorの問題に遭遇します。多くのJava開発者は...

プログラミングの世界でのIntellijideaのクラッキングの分析方法に関して、Intellij ...

問題の紹介:改善されたビデオ品質は、特に低解像度ビデオの処理、Java言語の使用方法など、ビデオ処理の重要な部分です。

スプリングブートアプリケーションの処理では、リクエストパラメーターを正しく受信する方法の問題に遭遇することがよくあります。特にパラメーター形式が一般的なJSONではない場合、もっと...

JavaプログラミングのJavaで並行ハッシュマップを宣言するときに静的を追加することの影響、Concurrenthashmap ...

カスタムスレッドプールでのinitialize()メソッドの役割の詳細な説明カスタムスレッドプールを構成すると、初期化()メソッドがあることに気付く場合があります。とても...

曲線積分における可変置換に関する質問質問者は曲線の統合問題に遭遇し、1つのステップの計算結果がそれを混乱させます。タイトルが与えられます...


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、
