最近、コードの最適化を行うときにJavaマルチスレッドの使用を学び、研究し、初心者の洞察を読んだ後に要約しました。
1.スレッドクラスを継承して、マルチスレッドを実装します
スレッドクラスを継承するメソッドはマルチスレッド実装メソッドとしてリストされていますが、スレッドは基本的にスレッドのインスタンスを表す実行可能なインターフェイスのインスタンスであり、スレッドを開始する唯一の方法は、スレッドクラスのstart()インスタンスメソッドを使用することです。 start()メソッドは、新しいスレッドを起動してrun()メソッドを実行するネイティブメソッドです。この方法は、マルチスレッドを実装するのが非常に簡単です。独自のクラスを直接拡張し、run()メソッドを書き換えることにより、新しいスレッドを起動して、定義するrun()メソッドを実行できます。例えば:
public class mythread extends thread {public void run(){system.out.println( "mythread.run()"); }}次のように、適切な場所でスレッドを開始します。
mythread mythread1 = new mythread(); mythread mythread2 = new mythread(); mythread1.start(); mythread2.start();
2。実行可能なインターフェイスを実装して、マルチスレッドを実装します
クラスがすでに別のクラスを拡張している場合、スレッドを直接拡張することはできません。現時点では、次のように実行可能なインターフェイスを実装する必要があります。
public class mythreadは、他のクラスの実装を拡張します。runnable{public void run(){system.out.println( "mythread.run()"); }} MythReadを開始するには、まずスレッドをインスタンス化して、自分のMythReadインスタンスを渡す必要があります。
mythread mythread = new mythread();スレッドスレッド= newスレッド(mythread); thread.start();
実際、実行可能なターゲットパラメーターがスレッドに渡されると、run()スレッドメソッドがターゲットを呼び出します。JDKソースコードを参照してください。
public void run(){if(target!= null){target.run(); }} 3. executorservice、callable、futureを使用して、返品結果を伴うマルチスレッドを達成する
ExecutorService、Callable、およびFuture Objectsは、実際にはエグゼキューターフレームワークの機能クラスです。これは、フレームワークの非常に詳細な説明です。結果を返すスレッドは、JDK1.5で導入された新機能です。それは確かに非常に実用的です。この機能を使用すると、リターン値を取得するために多くのトラブルを実行する必要はありません。たとえそれが実装されていても、抜け穴でいっぱいかもしれません。
値を返すことができるタスクは、呼び出し可能なインターフェイスを実装する必要があります。同様に、値を返さないタスクには実行可能なインターフェイスが必要です。呼び出し可能なタスクを実行した後、将来のオブジェクトを取得できます。コールオブジェクトに触れて、呼び出し可能なタスクによってオブジェクトを返します。 Thread Pool Interface Executorserviceと組み合わせることで、返信結果を使用した伝説的なマルチスレッドを実現できます。以下は、結果が返された完全なマルチスレッドテストの例です。 JDK1.5で確認した場合は、直接使用できます。コードは次のとおりです。
java.util.concurrent。*; Import Java.util.date; java.util.listをインポートします。 java.util.arraylistをインポートします。 / *** return valueを備えたスレッド*/ @suppresswarnings( "unchecked")public class test {public static void main(string [] args)throws executionexception、furtrededexception { System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Create a thread pool ExecutorService pool = newfixedthreadpool(tasksize); system.out.println( ">>>" + f.get()。 //(Future F:list)のすべての同時タスクの実行結果を取得{//将来のオブジェクトからタスクの返品値を取得し、コンソールSystem.out.println( ">>>" + f.get()。toString()); } date date2 = new date(); System.out.println("----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- mycallable(tasknum = tasknum; dateTmp1.getTime();コード説明:
上記のコードでは、エグゼキュータークラスはスレッドプールを作成するための一連の工場メソッドを提供し、返されたスレッドプールはすべてエグゼクティブサービスインターフェイスを実装しています。
public static executorservice newfixedthreadpool(int nthreads)
固定された数のスレッドを備えたスレッドプールを作成します。
public static executorservice newcachedthreadpool()
キャッシュ可能なスレッドプールを作成すると、executeを呼び出すと、以前に構築されたスレッドが再利用されます(スレッドが使用可能な場合)。既存のスレッドが使用できない場合は、新しいスレッドを作成してプールに追加します。 60秒間使用されていないキャッシュからスレッドを終了して削除します。
public static executorservice newsinglethreadexecutor()
シングルスレッドエグゼキューターを作成します。
public Static Static ScheatedExecutorservice NewsCheduledThreadPool(int CorePoolsize)
タイムで定期的なタスク実行をサポートするスレッドプールを作成します。これは、ほとんどの場合、タイマークラスの代わりに使用できます。
executoreServiceは、submit()メソッドを提供し、呼び出し可能または実行可能な渡され、将来を返します。エグゼキューターのバックグラウンドスレッドプールが呼び出し可能な計算が完了していない場合、この呼び出しは将来のオブジェクトのget()メソッドを返します。これにより、計算が完了するまでブロックされます。