この本は本当に良いです「Javaコア・テクノロジー」、非常に包括的な知識のポイント、翻訳品質も良いですが、このシリーズボーエンは、同時に本の各章の要約です。
スレッドとは何ですか
公式の説明:スレッドは、処理中を含むスケジューリング動作可能なオペレーティング・システムの最小単位である単位プロセスの実際の動作です。そのスレッドは、キャリアコードの実行は、我々のコードは、最も簡単なhellowWorld例の一つにスレッドで実行されます。
public class Main {
public static void main(String[] args) {
System.out.println("Hello World!");
System.out.println("当前线程名为:"+Thread.currentThread().getName());
System.out.println("当前线程id为:"+Thread.currentThread().getId());
}
}
結果は以下のとおりです。
Hello World!
当前线程名为:main
当前线程id为:1
メイン、スレッドID 1:デフォルトコードを実行するメインスレッドを作成し、プログラムは、標題のスレッドを実行します
マルチスレッドとは何ですか
名前が示唆するように、複数のスレッドが同時に実行するプログラムの実行速度を向上させるということです。シングルスレッドが一つだけを行うことができ、次の2つの方法の効率を改善したいです。
- 非同期。スレッドは計算に時間ではありませんほとんどの時間は、IOアクションを待っているので、待機時間は、スレッドの使用率を改善するために利用することができます。あまりにも多くの議論を作り、Node.jsの非同期を学ぶについての詳細を学ぶためにしたくない(ネイティブサポート非同期)
- マルチスレッド。スレッドは一つだけを行うことができ、その後、複数のスレッドは、スレッドの数を増やすことにより、実行速度を高めるために、同時により多くのことを行うことができるようになります。
スレッドを作成する方法
スレッドを作成するには、2つの方法があります。
- Threadクラスの継承
- 実行可能なインタフェースを実装
Threadクラスの継承
これは明白な理由のために、スレッドを作成する方法が推奨されていません:あなたはThreadクラスが他のクラスを継承する継承することができない場合は、Javaは、多重継承をサポートしていません。
次のように作成スレッド化コードの継承が使用されます。
public class CustomThreadExtendThread extends Thread{
@Override
public void run() {
String threadName = Thread.currentThread().getName();
long threadId = Thread.currentThread().getId();
System.out.println("创建线程名为:"+threadName+",id为:"+threadId);
}
public static void main(String[] args){
Thread thread1 = new CustomThreadExtendThread();
Thread thread2 = new CustomThreadExtendThread();
thread1.start();
thread2.start();
}
}
実行可能なインタフェースを実装
現在の方法として推奨されるスレッドを作成するためのインターフェイスを実装し、その理由は簡単です:クラスは複数のインタフェースを実装することができます。他のインタフェースを実装するために行くために実装クラスには影響しません、Runnableインタフェースを実装します。
インターフェイスを達成するためのスレッドを作成するために、次のコードを使用します。
public class CustomThreadImplementInterface implements Runnable {
@Override
public void run() {
Thread.currentThread().setName(((Double) Math.random()).toString());
String threadName = Thread.currentThread().getName();
long threadId = Thread.currentThread().getId();
System.out.println("创建线程名为:" + threadName + ",id为:" + threadId);
}
public static void main(String[] args) {
Thread thread1 = new Thread(new CustomThreadImplementInterface());
Thread thread2 = new Thread(new CustomThreadExtendThread());
thread1.start();
thread2.start();
//使用lambda表达式,让创建线程更简单
new Thread(() -> {
System.out.println("创建了一个新线程");
}).start();
}
}
あなたは、Threadクラスは、ソースコードを見ることで、Runnableインタフェーススレッドを実装するクラスで見ることができます。
PS:フォローすべての実行可能スレッドを作成するためのコードを使用して
スレッド状態
上記は、単にスレッドの状態についての詳細を学ぶために今、スレッドの作成を実証し、そしてあります。Javaの仕様では、スレッドは、以下の6つの状態を持つことができます。
- 新(新しく作成されました)
- Runnableを(実行)
- ブロックされた(ブロッキング)
- 待機中(待機中)
- 時限待ち(待ちタイマ)
- 終了(終了)
新しく作成されたスレッド
スレッドが新しいスレッド(R)などの新しい演算子を使用して作成された場合は、スレッドが動作していない、新しく作成された状態に属しています。
実行可能スレッド
Threadクラスのstartメソッドの呼び出し後は、スレッドが実行可能状態です。
なぜ通話できる状態を実行しますか?
Javaの仕様は、CPU上で実行されませんので、別の状態として定義されています。だから、実行可能スレッドが実行しても良いし、CPUスケジューリングポリシーに応じて、実行されないことがあります。
そして、スレッドは待機中のスレッドをブロックされています
スレッドがブロックされたり待機状態された場合、任意のコードを実行し、最小限のリソースを消費しません。再実行するまで。ブロックまたは待機状態にスレッドばかりのいくつかの方法があります。
- スレッドは、内部オブジェクトのロックを取得しようとすると、ロックが別のスレッドによって保持されているとき
- スレッドが別のスレッドスケジューラを待っているときの状態が待機状態に入る通知します。例えば、はObject.waitまたはThread.joinメソッドを呼び出す、またはライブラリjava.util.concurrentのロック状態やときを待ちます。
- ときwaitメソッドを呼び出しタイミング。たとえばのThread.sleep、はObject.wait、Thread.join、Lock.tryLockとCondition.await
終了したスレッド
最終状態を入力するには、次の2つの方法でスレッド:
- runメソッドの終了と自然死
- runメソッドや不慮の死を中止キャッチされません
注意: STOPメソッドの呼び出し元のスレッドが、スレッドを終了することができますが、この方法が放棄された、それを使用するのが最善ではありません。
スレッドの属性
優先順位、デーモンスレッド、スレッドグループをキャッチされない例外処理プロセッサ:スレッドがさまざまな属性を持っています。
スレッドの優先順位
Javaは、各スレッドが優先されます。デフォルトでは、スレッドは親スレッドの優先順位を継承します。また、呼び出すことができるsetPriority
メソッド指定された優先順位を。優先順位の範囲:1(MIN_PRIORITY)-10(MAX_PRIORITY ).NORM_PRIORITY 5、これらの定数は、Threadクラスで定義されています。
注:スレッド優先システムに大きく依存し、優先度のJavaスレッドの優先順位は、ホストプラットフォームにマップされている場合、優先度の数が少なくなったり、例えば0となるように、Windowsの7つの優先順位付けしていますJavaスレッドマッピング部の優先度は、同じオペレーティングシステムの優先度にマッピングされる場合。オラクルのLinuxは、すべてのJavaスレッドの優先度が同じ、スレッドの優先順位を無視して、Java仮想マシンで書かれています。優先順位を依存しているコードを記述しないでください。
デーモンスレッド
呼び出すことにより、Thread.setDaemon(true)
スレッドをデーモンスレッドに変換されます。ユーザのみデーモンスレッドは、スレッドのタイミングのような他のスレッドにサービスを提供することで、タイミング信号のタイミングは、他のスレッドに送られます。仮想マシンが唯一のデーモンスレッドであるときそのため、仮想マシンが終了をシャットダウンします。すべてのビジネス・ロジックを処理し、スレッドガード内の任意のリソースにはアクセスしないでください
キャッチされない例外ハンドラ
スレッドのrunメソッドは、任意のチェック例外を投げることができない、非例外がキャッチ例外をキャッチ/しようとするだけではなく、例外を処理するために捕捉されない例外プロセッサによって、スレッドが終了します確認。例外ハンドラは、実装する必要があるThread.UncaughtExceptionHandler
インターフェイスを。
スレッドの例で使用できるsetUncaughtExceptionHandler()
スレッドの方法設定処理を、それを使用することもできるThread.setDefaultUncaughtExceptionHandler()
、以下のように、すべてのプロセッサスレッドのデフォルト設定のために:
public class CustomExceptionHandler implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("捕获到线程"+t.getName()+",异常:" + e.getMessage());
e.printStackTrace();
}
public static void main(String[] args) {
Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler());
new Thread(() -> {
throw new RuntimeException("test");
}).start();
}
}
スレッドグループオブジェクト(スレッドグループオブジェクトが実装しているため、あなたは--ThreadGroupのスレッドのプロセッサのスレッド、その後、別のプロセッサスレッドの設定とデフォルトのプロセッサを設定していないしていない場合はThread.UncaughtExceptionHandler
インターフェイスを)。
:使用されているすべてのコードBenpian GitHubの
Benpianオリジナル投稿日:https://www.tapme.top/blog/detail/2019-04-08-20-52