スレッドを作成するにはいくつかの方法
並行プログラミングでは、スレッドが作成され、私たちは頻繁に行うので、一般的に言えば、スレッドを作成するための4つの方法があります。
1、継承Threadクラス。
、Runnableインタフェースを達成するために2、。
図3に示すように、組み合わせて使用される呼び出し可能インタフェースFutureTaskを実装します。
図4に示すように、スレッドプールモードを使用して実施すること。
スレッドを作成するための継承スレッド
パブリック クラス ThreadTest1は拡張スレッド{ @Override 公共 ボイドの実行を(){ しようと{ のThread.sleep( 1000 ); } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } のSystem.out.println( "ThreadTest1が実行されています" )。 } パブリック 静的 ボイドメイン(文字列[]引数)スローInterruptedExceptionある{ ThreadTest1 threadTest1 = 新しいThreadTest1を(); threadTest1.start(); System.out.printlnは( "最初:" + のSystem.currentTimeMillis()); のThread.sleep( 1000年); threadTest1.run(); System.out.printlnは( "第二:" + のSystem.currentTimeMillis( )); } }
結果の実装: まず: 1,569,155,515,336 ThreadTest1が実行されている ThreadTest1が実行されている 第二: 1569155517338
出力文で実行される、出力実行の最初のスレッドの時間とは、threadTest1.runを呼び出す()メソッドが最初に実行されたときthreadTest1.start()を呼び出し、上記の例から分かるように実行した後、run()メソッドをThreadTest1実際の文の出力メインスレッドには、(実行するためのダイレクトコールを描くことができるように)メソッドは、スレッドを開始する方法はありませんが、直接呼び出し元のスレッドのrun()メソッドおよびスレッドでは何の関係もありません、スレッドの道がThread.startを呼び出すことです開始()メソッド。
スレッドを作成するには、Runnableインタフェースを実装
パブリック クラス ThreadTest2は実装したRunnable { @Override 公共 ボイドの実行を(){ しようと{ のThread.sleep( 1000 ); } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } のSystem.out.println(「スレッドが実行されています」)。 } パブリック 静的 ボイドメイン(文字列[]引数){ ThreadTest2 threadTest2 = 新しいThreadTest2()。 スレッドスレッド = 新しいスレッド(threadTest2)。 thread.start(); System.out.println(のSystem.currentTimeMillis())。 } }
1は、原因JAVAはそうスレッドを作成するために、実際のプロジェクトでは、Runnableインタフェースを実現するために、多重継承を許可していないインタフェースの実装である、連続しているスレッドを作成するために、継承Threadクラスとは異なり、実装があるスレッドを作成、Runnableインタフェースを実装のより多くのモードまたは使用。
呼び出し可能インターフェースを実装
パブリック クラス ThreadTest3が実装呼び出し可能に<整数> { @Override パブリック整数コール()がスロー例外{ int型 I = 0 。 用(; iが100 <; Iは++ ){ System.out.printlnは(にThread.currentThread()のgetName() + "" + I)。 } のSystem.out.println(にThread.currentThread()のgetName() + "" + I)。 返す私は、 } パブリック 静的 ボイドメイン(文字列[]引数)がスロー = InterruptedExceptionあるが{ ThreadTest3 threadTest3 新しいThreadTest3(); // 很重要、无论多少个线程调用futureTask、futureTask只会执行一次 FutureTask <整数> futureTask = 新しい FutureTask <整数> (threadTest3)。 スレッド1スレッド = 新しいスレッド(futureTask、 "AA"を)。 スレッド2スレッド = 新しいスレッド(futureTask、 "BB"を)。 thread3スレッド = 新しいスレッド(futureTask、 "CC"を)。 thread1.start(); Thread.sleep( 3000 ); thread2.start(); Thread.sleep( 3000); thread3.start(); 試み{ するSystem.out.println( "最終結果" + futureTask.get()); } キャッチ(ExecutionException E){ e.printStackTrace(); } } }
最も重要なことを達成するための呼び出し可能インターフェースは、スレッドの実行の戻り値を取得することですが、FutureTaskと実装クラス呼び出し可能インターフェースを使用する必要があるが、我々は、上記の例は非常に重要なポイントは、どのように多くのスレッドに関係なく、最終的にfuturetaskを実行することになるということであることに注意してくださいそこに実行スレッドがあるので、この方法は、複数のスレッドが誤った結果になり呼び出す心配しないでください、となっ同時に安全になります。
スレッドを作成するスレッドプールを使用します
パブリック クラスThreadMain { 公共 静的 ボイドメイン(文字列[]引数)がスローInterruptedExceptionある、ExecutionExceptionを{ ExecutorServiceのExecutorServiceの = Executors.newFixedThreadPool(3 )。 呼び出し可能 <整数>呼び出し可能= 新しいThreadTest3(); 将来F = executorService.submit(呼び出し可能)。 System.out.println( "最终结果为" + f.get()); executorService.shutdown(); ExecutorServiceのexecutorService2 = Executors.newFixedThreadPool(3 )。 スレッドスレッド = 新しいですThreadTest1(); executorService2.execute(スレッド)。 executorService2.shutdown(); } }
スレッドを作成するスレッドプールを使用して、実用化にマルチスレッドを使用して、実際には、スレッドを作成する方法のか、3つの方法上記のエッセンスをスレッドプールを作成することではなく、比較してタスクを実行するエグゼキューの静的メソッドに主に依存していますそしてより多くの。