1.は、同時並列何ですか
マルチスレッドを学ぶためには、まず、同時並列であるかを理解しなければなりません
平行:2つ以上のイベントを指し、同時に(同時に)生じます。
同時実行は:中二つ以上のイベントを指し、同じ期間内に発生しました。
2.プロセス、スレッドとは何ですか
プロセス:
プロセスは、プログラム実行中のインスタンスです。
プロセスは、プロセスが複数のスレッドを開くことができ、ある容器のスレッドです。
このようなブラウザを開くと、開いたAワードその他の動作は、プロセスを作成します。
スレッド:
スレッドは、プロセス内の独立した実行ユニットです。
このプロセスは、同時に複数のスレッドを実行することができます。
例えば、プロセスは、病院、スレッドが登録され、治療、支払い、薬やその他の事業活動として理解することができます
マルチスレッド:複数のスレッドを同時に。
スレッドを作成します3。
Javaスレッドが作成され、4つの方法があります。
リットルのThreadクラスの継承
lはRunnableを実装します
リットルのリアライズ呼び出し可能インターフェース
リットルのスレッドプール
3.1。Threadクラスの継承
3.1.1手順1:カスタム・スレッド・クラスを作成します。
com.creatTheraパッケージ変更のため、 輸入java.util.Date; / * * * @Auther:lanhaifeng * @date:2019年11月20日午前9時20分0020 * @description:マルチスレッドの継承Threadクラスが実装 * @statementを: * / パブリック クラスはMyThreadスレッド{延び 公共 ボイドRUN(){ ために(INT I = 0 ; I < 10 ; I ++ ){ システム。OUT .println(" MyThread実行中のスレッド:" + I); } } パブリック 静的 ボイドメイン(文字列[]引数){ MyThreadはMyThread = 新しい新規; MyThreadを() myThread.start(); のための(INT I = 0 ; I < 10 ; I ++ ){ システム。OUT .println(" メインスレッドが実行している:" + I); } } }
次のような結果の実装は次のようになります。
3.2。実装Runnableを
3.2.1ステップ1:、Runnableインタフェースを実装するカスタムクラスを作成します。
com.creatTheraパッケージのペナルティ; / * * * @Auther:lanhaifeng * @date:2019年11月20日午前9時32 0020 * @description:実行可能なスレッドを作成するために、インターフェイスを実装 * @statement: * / パブリック クラスMyRunable実装Runnableを{ 公共 ボイドRUN (){ 用(INT I = 0 ; I < 10 ; I ++ ){ システム。OUT .println(" myRunnable実行中のスレッド:" + I); } } // テストスレッド パブリック 静的 ボイドメイン(文字列[]引数) { スレッドスレッド = 新しいスレッド(新しいMyRunable()); thread.start(); 用(INTは iは= 0 ; I < 10 I ++; {) システム。アウト .println(" 主线程正在执行:" + I)。 } } }
次のような結果の実装は次のようになります。
3.3。呼び出し可能インターフェースを実装
3.3.1。FutureTaskの紹介
次のように呼び出し可能な必要性のヘルプFutureTaskクラスの実行は、FutureTaskクラスの構造は次のとおりです。
将来のインタフェース:
タスクが完了したかどうかを確認します。isDone()
作業を中断することができます(キャンセル)
タスクの実行結果を得ることができます。get()
3.3.2ステップ1:呼び出し可能インターフェースを実装するカスタムクラスを作成します。
com.creatTheraパッケージ変更のため、 インポートしているjava.util.concurrent。 * ; / * * * @Auther:lanhaifeng * @date:2019年11月20日9時41 0020 * @description:スレッドを作成するための呼び出し可能インターフェースを実装して 呼び出し可能インターフェース:* @statement戻り値がある * / パブリック クラス MyCallnable実装呼び出し可能<文字列> { 公共の文字列()の呼び出しが例外{スロー のために(int型 I = 0 ; I < 10 ; I ++ ){ システム。OUTの(.println 「myCallableスレッドが実行されます。「 + I); } リターン " MyCallabeスレッドを終了する" ; } // テスト パブリック 静的 ボイドメイン(文字列[]引数){ // オブジェクトがfuturetask作成 FutureTask、<文字列> = FutureTask 新しい新しい FutureTask、<文字列>(新しい新しいMyCallnableを()); //は、スレッドオブジェクトを作成着信FutureTask スレッドのスレッド= 新しい新しいスレッド(FutureTask); Thread.start(); のための(INT I = 0 ; I < 10 ; I ++ ){ システム。OUT .println(" メインスレッドが実行されています:"+ I)。 } } }
図は次のような結果を操作します:
3.4スレッドプール-Executor
3.4.1。スレッドプールスレッドのクラス図
エグゼキュータ・インタフェース:
実行(Runnableを実行可能な)方法であって、タスクを実行するコードが宣言します
ExecutorServiceのインタフェース:
エグゼキュータ・インターフェースの継承、宣言方法:提出、invokeAll、invokeAnyやシャットダウンなど
抽象クラスAbstractExecutorService:
すべてのメソッドは、基本的に宣言されたExecutorServiceのをExecutorServiceのインターフェースを実現します
ScheduledExecutorService接口:
ExecutorServiceの継承されたインターフェイスのメソッド宣言スケジュールされたタスク
ThreadPoolExecutor类:
クラスAbstractExecutorServiceを継承、提出し、実行し得る、シャットダウン、shutdownNowの方法
ScheduledThreadPoolExecutor类:
ThreadPoolExecutorクラス継承、およびインターフェースはScheduledExecutorServiceの方法であって、前記を実装実装しました
執行クラス:
すぐにスレッドプールを作成するための方法を提供するために、
3.4.2ステップ1:、Runnableインタフェースを実装するカスタムクラスを作成します。
com.creatTheraパッケージ変更のため、 インポートjava.util.concurrent.ExecutorService; インポートjava.util.concurrent.Executors; / * * * @Auther:lanhaifeng * @date:2019年11月20日9時52 0020 * @description:使用スレッドスレッドプールを作成します :* @statement * / パブリック クラスMyExecutors { // 実行可能なインタフェースがサポートにのみ実行可能なスレッドプールとコーラブル実装 クラスMyRunnableを実装し、実行可能な{ 公共 のボイド{)RUN( のために(int型 I = 0 ; I < 10 ; I ++ ) { システム。OUT .println("myRunnableスレッド実行されている:" + I); } } } // テストスレッドプール使用スレッド作成 パブリック 静的 ボイドメイン(文字列[]引数を){ // 1.エグゼキュータ使用してスレッドプールを作成 ExecutorServiceのExecutorServiceの= Executors.newFixedThreadPool(10 )を; // 実行の2スレッドプールのスレッド、支持体のみ実行可能なスレッドプール、呼び出し可能 executorService.execute(新しい新しいMyRunable()); // 3.主糸ループ印刷 のために(INT I = 0 ; I < 10 ; I ++ ){ システム。OUT.println(" 主メインスレッドが実行されている:" + I); } } }
結果を達成するため、次のとおりです。
3.5。まとめ
3.5.1。インターフェースを実装し、Threadクラスの比較を継承
Lは、同じリソースを共有するためのプログラムコードを複数のスレッドに同じインタフェースに適しています。
Javaのインタフェースリットルで、単一継承の制限は回避します。
コードインターフェースLは、複数のスレッドで共有され、コードの独立したスレッドもよいです。
リットルのスレッドプールのスレッドが唯一の継承Threadクラスに直接、Runableまたは呼び出し可能インターフェースを実現するためにはない置くことができます。
拡張:
Javaでは、毎回のプログラムは、少なくとも二つのスレッドを実行するために開始します。一つは、メインスレッド、ガベージコレクションスレッドです。
3.5.2。Runnableを、呼び出し可能インタフェースは、比較します
同じポイント:
両方のインターフェイスがlです。
Lは、マルチスレッド・プログラムを作成するために使用することができます両方。
両方リットル必要)が(Thread.startを呼び出すスレッドを開始します。
違い:
Lは、実行結果を返すために呼び出し可能インタフェーススレッドを実装;、Runnableインタフェース実現のスレッドが結果を返すことができません。
L呼び出し可能呼び出しインタフェース()メソッドは、許可例外をスローし、例外の研磨実行のRunnableインターフェース()メソッドを許可せず。
呼び出し可能インターフェースのスレッドがFuture.cancelが実行をキャンセル呼び出すことができ、およびスレッドはRunnableを実装できませんリットルを実現
注意点:
結果の実装が返された呼び出し可能インターフェースのサポートは、「将来の成績を得るために、メインスレッドまでFutureTask.get()メソッドの実装で、このメソッドはブロックを呼び出すために、この時間が必要、このメソッドを呼び出していない場合は、メインスレッドはブロックされません!