次の例は、主に2つの問題について説明します。
質問1。スレッドプールのサイズは5であると仮定します。10個のスレッドをスレッドプールに入れることの操作効果はどうですか?他のスレッドのステータス?
質問2。では、スレッドプールからスレッドを削除したり、正確にするには、スレッドをアイドルスレッドにするにはどうすればよいですか?
例:
パッケージcom.dada.executorservice; java.util.concurrent.timeunitをインポートします。 public class jobthreadはスレッド{//スレッドの名前public thread(string name、long threadid){super(name); } @Override public void run(){//メインスレッドにこのスレッドが含まれている場合、(mainthread.threadnamemap.containskey(this.getName()))){try {system.out.println( "スレッド名:-----" + this.getName()); TimeUnit.seconds.sleep(4); } catch(Exception e){e.printstacktrace(); }} system.out.println( "******************スレッドエンド、スレッド名:***************" + this.getName()); }}パッケージcom.dada.executorservice; java.util.hashmapをインポートします。 java.util.concurrent.executorserviceをインポートします。 java.util.concurrent.executorsをインポートします。 java.util.concurrent.timeunitをインポートします。 public class mainthread {public static final int threadpool_size = 5; //固定サイズのスレッドプールpublic static executorservice execons.newfixedthreadpool(threadpool_size); //スレッド名を保存するために使用されるマップpublic static Map <string、string> threadnamemap = new hashmap <string、string>(); public static void main(string [] args){// 10個のスレッドをスレッドプールに挿入しますが、スレッドプールは最大5個のスレッドのみを許可するため、他の5個のスレッドは(int i = 0; i <threadpool_size+5; i ++){string threadname = getthreadname(i); StreadNameMap.put(threadname、threadname); exec.execute(new jobthread(threadname、i)); } system.out.println( "ハッシュテーブルのサイズ:" + threadnamemap.size()); try {System.out.println( "メインスレッドはしばらく眠ります!"); TimeUnit.seconds.sleep(3); } catch(Exception e){e.printstacktrace(); System.out.println( "Wake Up!"); } //以下は、スレッドプールのスレッドを削除するために使用されます// removethread(0); // removethread(1); // removethread(2); } public static void removethread(int i){threadnamemap.remove(getThreadName(i)); system.out.println( "delete threadthread" + i + "、ハッシュテーブルのサイズ:" + threadnamemap.size()); } public static string getthreadName(int i){return "threadname"+i; }}コード結果を直接実行します:
ThreadName:------ threadname0
ハッシュテーブルのサイズ:10
メインスレッドでしばらく眠ります!
ThreadName:------ threadname2
ThreadName:------ threadname4
ThreadName:------ threadname1
ThreadName:------ threadname3
ThreadName:------ threadname4
ThreadName:------ threadname2
ThreadName:------ threadname3
ThreadName:------ threadname1
ThreadName:------ threadname0
ThreadName:------ threadname1
ThreadName:------ threadname3
ThreadName:------ threadname0
ThreadName:------ threadname4
ThreadName:------ threadname2
ThreadName:------ threadname1
ThreadName:------ threadname3
ThreadName:------ threadname4
結論は:
印刷されているのが見つかりました:スレッド名はthreadname0からthreadname4まで、他の名前はありません。
10個のスレッドがスレッドプールに配置されていることが証明されていますが、スレッドプールのサイズは5で、CPUを割り当てることができるスレッドのみが5個のスレッドのみです。実行中のものは最初にスレッドプールに入れられ、他のスレッドは準備ができた状態(ブロック状態)にあります。
コメントを削除した後、コードは実行されます。
ThreadName:------ threadname0
ThreadName:------ threadname2
ThreadName:------ threadname4
ハッシュテーブルのサイズ:10
メインスレッドでしばらく眠ります!
ThreadName:------ threadname1
ThreadName:------ threadname3
スレッドスレッド0、ハッシュテーブルのサイズを削除:9
スレッドスレッド1、ハッシュテーブルのサイズを削除:8
スレッドスレッド2、ハッシュテーブルのサイズを削除:7
***************スレッドエンド、スレッド名:*********スレッド名2
***************スレッドエンド、スレッド名:********* threadname0
ThreadName:------ threadname5
ThreadName:------ ThreadName6
***************スレッドエンド、スレッド名:*********スレッド名1
ThreadName:------ threadname4
ThreadName:------ ThreadName7
ThreadName:------ threadname3
ThreadName:------ ThreadName6
ThreadName:------ threadname5
ThreadName:------ ThreadName7
ThreadName:------ threadname4
ThreadName:------ threadname3
ThreadName:------ threadname5
ThreadName:------ ThreadName6
ThreadName:------ ThreadName7
ThreadName:------ threadname4
ThreadName:------ threadname3
結論は:
結果から、スレッドを削除する前に、実行中のスレッドはまだthread0からthread4にあることがわかります。スレッドスレッド0を削除した後、新しいスレッドスレッド3が実行を開始し、順番にthreadname7に移動します。
概要は次のとおりです。
1.スレッドプールのサイズは5であると仮定して固定されています。次に、10個のスレッドをスレッドプールに入れることの操作効果はどうですか?他のスレッドのステータス?
a。スレッドプールの概念は、リクエストをプッシュし続けていることですが、指定されたクォータでスレッドのみを処理でき、追加のスレッドが待機します。
b。スレッドのいずれかが処理を完了すると(ビジネスの実行が完了するか、ループが終了されます)、スレッドプールは自動的に待機キューからジョブを取り出し、アイドルスレッドを使用してジョブを実行します。実行中のスレッドプールのどのスレッドプールは、配置される順序に基づいている必要があります。
2。では、スレッドプールからスレッドを削除したり、正確にするためにスレッドをアイドルスレッドにする方法は?
スレッドプールは、スレッドプールを使用してメインスレッドとメインスレッドによって開かれたスレッドが同じレベルであり、相手の生存を支配する権利がないため、スレッドの1つを取得して殺すことはできません。ただし、メソッドを変更し、目標を巧みに達成できます。
a。メインスレッドは、ハッシュマップになる可能性のあるハッシュテーブルを維持します。重要な値は任意ですが、それは一意でなければならず、スレッドを一意に示すことができます。
b。スレッドプールに配置されたすべてのスレッドは、キー値を生成し、このハッシュマップに保存する必要があります。
c。 while(true)のスレッドなどのループクラスのスレッドの場合。このスレッドのキーが上記のハッシュマップに存在するかどうかを確認するために、条件を追加する必要があります。 whileループが存在しない場合は終了します。
d。メインスレッドは他のスレッドの生存を支配することはできませんが、独自のハッシュマップを配置または削除できます。この時点で、スレッドの対応するキー値がハッシュマップから削除される限り、スレッドは次にループするときに自動的に終了します。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。