スレッド1件のメッセージモード(この作業はあなたに任されています)
あなたが非常に忙しいとき、会社の階下に宅配便があるので、あなたはあなたの仕事を続けることができるようにあなたの宅配業者を手伝うようにあなたの同僚に任せます
スレッド1枚のメッセージモードでは、メッセージのデリゲートエンドと実行端は異なるスレッドです。メッセージの代表者の終わりは実行エンドスレッドを伝え、この作業はあなたに引き渡されます。
ホストクラス:
リクエスト用のスレッドを作成するクラスは、主に新しいスレッドを開き、ヘルパーハンドルを呼び出し、テキストを渡すことです。
public class host {private final helper helper = new Helper(); public void request(final int count、final char c){system.out.println( "request start"); new shood(){public void run(){helper.handle(){helper.handle(count、c);}}。ヘルパークラス:
文字表示機能を提供し、ゆっくりとメソッドを印刷時間をシミュレートします
パブリッククラスヘルパー{public void handle(int count、char c){system.out.println( "ハンドルメソッドスタート"); {thread.sleep(100);} catch(arturnedexception e){// todo auto-enerated catch blocke.printstacktrace();}}}}メインクラス:
ホストのインスタンスを作成し、リクエストメソッドを呼び出します
public static void main(string [] args){system.out.println( "main begin"); host host = new host(); host.request(10、 'a'); host.request(20、 'b'); host.request(30、 'c'); system.out.println( "main end");};テスト結果:
メインの始まり
リクエスト方法が開始されました
リクエストメソッドの終了
リクエスト方法が開始されました
リクエストメソッドの終了
リクエスト方法が開始されました
リクエストメソッドの終了
メインエンド
ハンドルメソッドを開始します
ハンドルメソッドを開始します
ハンドルメソッドを開始します
bacbacbacbacbacbacbacbacbacbacba
ハンドルメソッドの終了
cbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcb
ハンドルメソッドの終了
CCCCCCCCCCCC
ハンドルメソッドの終了
操作の結果から、リクエストメソッドは、実行前にハンドルメソッドが実行されるのを待機せず、ハンドルメソッドを呼び出し、実行が終了するまでリクエストメソッドに戻ります。したがって、これは、ハンドル方法に実行される特定の数の文字を印刷する作業を渡す要求方法と同等であり、リクエスト方法は、ハンドルメソッドが完了するのを待たずに愚かな方法で他のステートメントを実行できます。これはまた、一部の作業が時間がかかる場合、このモードで新しいスレッドを開始して処理を実行できることを示しています。このモードはサーバーに適用でき、サーバーの応答時間を短縮できます。
プロセスとスレッドを説明してください:
スレッドとプロセスの最大の違いは、メモリが共存するかどうかです。
各プロセスには、独自の独立したメモリスペースがあります。プロセスは、認可なしに他のプロセスのメモリを読み書きできません。プロセスのメモリスペースは互いに独立しているため、プロセスは他のプロセスによって破壊されることを心配する必要はありません。
スレッドは共存できます。 1つのスレッドがインスタンスにコンテンツを書き込み、他のスレッドはインスタンスのコンテンツを読み取ることができます。複数のスレッドは同じインスタンスにアクセスできるため、Mutexを正しく実行することを確認する必要があります。
ホストの設計最適化:
1. java.util.concurrentパッケージの下でスレッドファクトリーインターフェイスを使用してホストクラスを設計します
public class host {public void request(final int count、final char c){system.out.println( "request method starts"); threadfactory.newthread(new runnable(){@overridepublic void run(){// todo auto-venerated method method stubHelper.handle終了 ");}}対応するホストインスタンス化オブジェクト:
ホストhost = new host(executors.defaultThreadFactory());
この設計の利点は、新しいで作成された元のインスタンスコードがJava.lang.Threadクラスに依存し、作成スレッドの部分を制御できず、再利用できないことです。 ThreadFactoryを使用して対応するクラスのオブジェクトを保存し、新しいスレッドを作成するためにnewThreadメソッドを呼び出すと、スレッドの作成が実現されます。これはもはやスレッドクラスに依存しませんが、コンストラクターに渡されたスレッドファクトリーオブジェクトに依存します。これにより、スレッドの作成を制御する詳細が実装されます。
java.util.concurrent.xecutorインターフェイスを使用してホストクラスを再設計します。
以前のThreadFactoryインターフェイスは、スレッド作成の詳細を隠していますが、スレッド作成操作を非表示にしません。エグゼキューターインターフェイスを使用すると、スレッド作成操作も非表示になります。
パブリッククラスhost {プライベートファイナルヘルパーヘルパー= new Helper();プライベートファイナルエグゼキューターエグゼキューター;パブリックホスト(executor = executor = executor;} public void request(final int count、final.out.println( "request method started"); executor.execute(new runable(){@Overridepublic voido) stubhelper.handle(count、c);}}); system.out.println( "request method end");}}}java.util.concurrent.scheduledexecutorserviceクラスを使用して作成されました
パブリッククラスhost {プライベートファイナルヘルパーヘルパー= new Helper();プライベート最終スケジュールexecutorservice Scheduleedexecutorservice; public Host(Scheduledexecutoredexecutorservice){this.scheduleedexecutorservice = ScheduleDexecutorservice; Stapered ")); ScheduleDexecutorservice.schedule(new runnable(){@overridepublic void run(){// todo auto-fublated method stubhelper.handle(count、c);}}、3l、timeunit.seconds);メイン関数エントリをテストします:
ScheduleDexecutorservice Scheduleedexecutorservice = executors.newscheduledthreadpool(5); host host = new host(scheduleedexecutorservice); try {host.request(10、 'a'); host.request(20、 'b'); host.request( 'c'); catch(exceecious e at(cat); blocke.printstacktrace();}最後に{scheduledexecutorservice.shutdown(); system.out.println( "main end");}要約します
クライアントの役割は、ホストロールのリクエスト方法を呼び出し、リクエストの実際の処理は実行のためにヘルパーハンドルに引き渡されます。ただし、クライアントがリクエストから直接ハンドルメソッドを呼び出す場合、実際の操作が終了するまでハンドルメソッドから返すことはできません。これにより、リクエストの応答パフォーマンスが低下します。したがって、ホストの役割は、クライアントの役割からリクエストを処理し、スレッドがハンドルを呼び出すために使用される新しいスレッドを開始し、リクエストを作成するスレッドがすぐにハンドルから戻ることができるようにします。これは、スレッドごとのメッセージモードです。