以前のブログの投稿では、基本的にJavaの並行性のコンテンツを要約しました。このブログ投稿は主に問題から始まり、上記の要約された並行性テクノロジーを使用してそれらを解決できるかを確認します。
シナリオのシミュレーション:16のログレコードの処理、各ログレコード印刷時間には1秒かかります。通常の状況では、これらの16のレコードが終了した場合、16秒かかります。効率を改善するために、4つのスレッドを開始して印刷し、4秒で印刷してこのデモを実現する準備ができています。
最初にこの質問を分析しましょう。これらの16のログレコードについては、メインスレッドでそれらを生成できます。これは難しくありません。重要なのは、4つのスレッドを起動して実行することです。現在、2つのアイデアがあります。1つは、ログの生成と、ログを印刷するスレッドが論理的に分離されていることです。もう1つは、ログの生成とログを印刷するスレッドが論理的に分離されていないことです。これは少しあいまいかもしれません。これらの2つのアイデアに基づいて、実装されたデモを作成させてください。
ログの生成とログ印刷は論理的に別々です。
これは2つの前面に相当します。1つのフロントは常にログを生成し、もう1つのフロントは常にログを印刷しています。ブロッキングキューの使用を考え、ブロッキングキューに接続し続けるログを生成し、ブロッキングキューから到達し続けるログを印刷するログを生成することは明らかです。ブロッキングキューのサイズは、16または1自分で設定できますが、これは実行に影響しません。したがって、BlockingQueueが使用されます。以下に実装されているデモを見てみましょう。
public class practice1 {public static void main(string [] args){//ブロッキングキューを定義すると、キューサイズには16個の情報blockingQueue <string> queue = new arrayblockingqueue <string>(16);(int i = 0; i <4; i ++){// 4つのスレッドを開きます。 run(){while(true){try {string log = queue.take(); // get log parselog(log); // print log} catch(arturtedexception e){// todo auto-generated catch.printstacktrace();}}}}}}}}}}}}}); (System.CurrentTimeMillis()/1000)); blocke.printstacktrace();}}} public static void parselog(string log){// log system.out.println(thread.currentthread()。getName()。 second} catch(arturnedexception e){// todo auto-enerated catch blocke.printstacktrace();}}}}}これは、システムが動作しており、常にログを生成し、複数のスレッドを継続的に開いてログ情報を印刷するようなものです。デモが書かれており、操作結果は投稿されていません。
ログの生成とログ印刷は論理的に分離されていません。
このアイデアは、私がログを生成するとき、あなたは私のためにそれを印刷し、4つのスレッドでそれを行うということです!したがって、このように考える場合、スレッドプールを使用する必要があります。最初に4つのスレッドを含むスレッドプールを作成し、次にログが生成されたときに、スレッドプールにスレッドを使用して実行するように依頼しました。デモは次のとおりです。
public class practice1 {public static void main(string [] args){executorservice service = executors.newfixedthreadpool(4); //スレッドプールsystem.out.println( "begin:" +(system.currenttimemillis()/1000)); service.execute(new runnable(){//スレッドを取得して@Override public void run(){parselog(log);}});} service.shutdown(); // end} public static void parselog(String log){system.out.out.out.currentthread() "---" +(System.CurrentTimemillis()/1000)); try {thread.sleep(1000); //ログのシミュレーションは1秒かかります1秒} catch(interruptedexception e){// dodo auto-denerated catch blocke.printstacktrace();}}}}}}}}}}}}ここでこの問題を要約しましょう。これらの2つのアイデアを理解している場合は、一般的に効果的に解決できます。
上記は、マルチスレッドの問題例コードをプログラミングするJavaに関するこの記事の全体的な内容です。誰にとっても役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!