1。執行者
執行者クラスは、「ツールクラス」と見なすことができます。 JDK1.6 APIの紹介を引用:
このパッケージで定義されている執行者、executorservice、ScheduleDexecutorservice、SthreadFactory、およびCallableクラスの工場および実用的な方法。このクラスはさまざまな方法をサポートしています。
(1)一般的に使用される構成文字列を使用して、executorserviceを設定する方法を作成して返します。
(2)一般的に使用されている構成文字列を使用して、スケジュールされたExecutorServiceを設定する方法を作成して返します。
(3)実装固有の方法をアクセスできないようにすることで再構成を無効にする「ラップされた」executorServiceメソッドを作成して返します。
(4)新しく作成されたスレッドを既知の状態に設定できるThreadFactoryの方法を作成して返す。
(5)閉鎖されていない呼び出し可能な方法を作成して返します。そうすれば、コール可能な必要な実行方法で使用できます。
このクラスを通じて、NewsingLethReadExecutor()を呼び出してシングルスレッドエグゼクティブサービスを取得するなど、スレッドプールの複数のインスタンスを取得して、NewFixedThreadPool()を呼び出して固定サイズのスレッドプールのエグゼクティブサービスを取得します。最も簡単なことは、それを使用して実行可能なオブジェクトを実行することです。または、呼び出し可能な<t>を実装するオブジェクトを実行することができます。 threadのstart()メソッドを使用した返品値はありません。スレッドによって実行された方法に戻り値がある場合、executorserviceを使用する方が良いでしょう。 submit()、invokeall()、またはinvokeany()を選択し、特定の状況に従って適切な方法を選択できます。
このクラスで提供される方法のいくつかは次のとおりです。
1.1 public static executorservice newcachedthreadpool()
必要に応じて新しいスレッドを作成するスレッドプールを作成しますが、以前に作成されたスレッドが利用可能になったときにそれらを再利用します。これらのスレッドプールは通常、多くの短期的な非同期タスクを実行するプログラムのプログラムパフォーマンスを改善します。
1.2 public static executorservice newfixedthreadpool(int nthreads)
固定数の再利用可能なスレッドを備えたスレッドプールを作成して、これらのスレッドを共有されていないキューに実行します。
1.3 public static executorservice newsinglethreadexecutor()
単一のワーカースレッドを使用して、タバウンドのキューでスレッドを実行するエグゼキューターを作成します。
3つのメソッドはすべて、インターフェイススレッドファクトリーのインスタンスで使用できます。 ExecutorServiceインターフェイスのインスタンスを返します。
2。インターフェイスThreadFactory
必要に応じて新しいスレッドオブジェクトを作成します。スレッドファクトリーを使用するには、新しいスレッドコールの手動書き込みが必要になり、アプリケーションが特別なスレッドサブクラス、プロパティなどを使用できるようにします。
このインターフェイスの最も単純な実装は、次のとおりです。
クラスSimplethReadFactoryを実装したThreadFactory {public Thread newThread(runnable r){return new Thread(r); }} 3。InterfaceExecutorservice
このインターフェイスは、終了を管理する方法を提供します。
4.標準のスレッドプールスタートアップスレッドを作成します
4.1実行可能なインターフェイスを実装する簡単なスレッドを提供する
mythread.java
パッケージcom.zj.concurrency.executors;パブリッククラスのmythreadは実行可能{private int count = 1、number; public mythread(int num){number = num; system.out.println( "create thread-" + number); } public void run(){while(true){system.out.println( "thread-" + "run" + count + "time(s)"); if(++ count == 3)return; }}}このスレッドは、対応する作成情報と実行情報を印刷します。
4.2 CachedThreadPoolを使用してスレッドを開始します
cachedthreadpool.java
パッケージcom.zj.concurrency.executors; import java.util.concurrent.executorservice; import java.util.concurrent.executors; public class cachedthreadpool {public static void main(string [] args){executorservice exec = executors.newcachedthreadpool(); for(int i = 0; i <5; i ++)execute(new Mythread(i)); exec.shutdown(); }}結果:
スレッド-0Createスレッド1Createスレッド2Createスレッド3thRead-0ラン1タイムスレッド-0スレッド1ラン1タイムスレッド1ラン2タイムラン1タイムスレッド2ラン2タイム2回実行2回実行2回実行
4.3 SixedThreadPoolを使用してスレッドを起動します
sixtthreadpool.javapackage com.zj.concurrency.executors; import java.util.concurrent.executorservice; import java.util.concurrent.executors; public class sixtthreadpool {public static void main(string [] args){executorservice exec = executors.newfixedthreadpool(2); for(int i = 0; i <5; i ++)execute(new Mythread(i)); exec.shutdown(); }}結果:
スレッド-0Createスレッド1Createスレッド-2Createスレッド3Createスレッド-4thread-0ラン1タイム2回のラン2タイムスレッド2ラン1タイム2回のランスレッド-3スレッド-3ランタイム2回スレッド-4スレッド-4ラン1タイム(S)スレッド1回スレッド1ラン2(S)スレッド1ラン2(S)
4.4 Singlethreadexecutorを使用してスレッドを起動します
singlethreadexecutor.java
パッケージcom.zj.concurrency.executors; import java.util.concurrent.executorservice; import java.util.concurrent.executors; public class singlethreadexecutor {public static void main(string [] args){executorservice exec = executors.newsinglethreadexecutor(); for(int i = 0; i <5; i ++)execute(new Mythread(i)); exec.shutdown(); }}結果:
スレッド-0Createスレッド1Createスレッド-2Createスレッド3Createスレッド-4thread-0ラン1タイムラン2タイムスレッド1ラン1タイムラン2タイムスレッド2ラン1タイムラン2タイムスレッド-3実行
5. ThreadFactoryインターフェイスの使用に協力します
デーモンと優先度の属性設定をスレッドに追加しようとしています。
5.1背景スレッドプロパティを設定します
daemonthreadfactory.java
パッケージcom.zj.concurrency.executors.factory; Import java.util.concurrent.threadfactory;パブリッククラスdaemonthreadfactoryを実装するthreadfactory {public thread newthread(runnable r){thread t = newスレッド(r); T.SetDaemon(True); tを返します。 }}
5.2優先属性を設定します
maxprioritythreadfactory.java
パッケージcom.zj.concurrency.executors.factory; Import java.util.concurrent.threadfactory; public class maxprioritythreadfactoryはthreadfactory {public thread newthread(runnable r){thread t = new thread(r); t.setpriority(thread.max_priority); tを返します。 }} Minimut PriorityMinpriorityThreadFactory.java
パッケージcom.zj.concurrency.executors.factory; Import java.util.concurrent.threadfactory; public class minpriorityThreadFactoryは、threadFactory {public thread newThread(runnable r){thread t = newスレッド(r); t.setpriority(thread.min_priority); tを返します。 }}
5.3属性設定でスレッドを開始します
execromfactory.java
パッケージcom.zj.concurrency.executors; import java.util.concurrent.executorservice; import java.util.concurrent.executors; import com.zj.concurrency.executors.factory.daemonthreadfactory; import com.zj.currency. com.zj.concurrency.executors.factory.minprioritythreadfactory; public class exectromfactory {public static void main(string [] args)throws execustorservice defaultexec = executors.newcachedthreadpool(); executorservice daemonexec = executors .newcachedthreadpool(new daemonthreadfactory()); executorservice maxpriorityexec = executors .newcachedthreadpool(new maxprioritythreadfactory()); executorservice minpriorityexec = executors .newcachedthreadpool(new minprioritythreadfactory()); for(int i = 0; i <10; i ++)daemonexec.execute(new mythread(i)); for(int i = 10; i <20; i ++)if(i == 10)maxpriorityexec.execute(new mythread(i)); else if(i == 11)minpriorityexec.execute(new mythread(i)); else defaultexec.execute(new mythread(i)); }}結果:
スレッド-0Createスレッド1Createスレッド2Createスレッド3thRead-0ラン1タイムスレッド-0スレッド1ラン1タイムスレッド1ラン2タイムラン1タイムスレッド2ラン2タイム2回実行スレッド-6createスレッド-7thread-7ラン1回スレッド7ラン2回スレッド8thread-8ラン1回スレッド8ラン2回2回実行スレッド-9createスレッド-10thread-10 run 1タイム(s)スレッド10ラン2ラン2時間TIME(S)スレッド-3 1回スレッド-3スレッド-12を実行するスレッド-12Createスレッド-13Createスレッド14thRead-12ランスレッド-12スレッド13ランスレッド13ラン1ラン2タイム2回のラン2タイムCREATEスレッド-15thRead-15ラン15ラン15ラン15ラン16(時間を作成するスレッド17Createスレッド-18Createスレッド-19thRead-14ラン1タイムスレッド14スレッド17ラン1タイムスレッド17スレッド-18スレッド1回スレッド-18ラン1ラン2ラン2時間スレッド19ラン1ランタイム(s)スレッド-19ラン2時間(s