ディレクトリ
スレッドの定義
1.1概要
スレッドは、依存するプロセス内に存在するスケジューリング実行ユニット、複数の実行パスのプログラムです。
1.2定義
1. Threadクラスの継承
/**
* 使用继承java.lang.Thread类的方式创建一个线程
*
* @author DreamSea 2011-12-29 20:17:06
*/
public class ThreadTest extends Thread {
/**
* 重写(Override)run()方法 JVM会自动调用该方法
*/
public void run() {
System.out.println("I'm running!");
}
}
欠陥は:スレッドの定義の後に継承スレッド方法の使用は、あなたのため、このメソッドの定義スレッドをお勧めしません不能再继承
、他のクラスは、主要なスケーラビリティのプログラムを大幅に削減します。
インタフェースjava.lang.Runnableの実装を2
/**
* 通过实现Runnable接口创建一个线程
* @author DreamSea
*/
public class ThreadTest implements Runnable {
public void run() {
System.out.println("I'm running!");
}
}
呼び出し可能と今後3.は、
呼び出し可能インターフェースの呼び出しオーバーライドメソッドを実装1.
実装したクラスのオブジェクトを作成します。2.
FutureTaskクラスオブジェクト実装することで、オブジェクトクラスを作成します。3.
クラスFutureTaskで最後のスタートを作成4.スレッドがオブジェクト
public class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
return 100;
}
public static void main(String[] args) {
MyCallable callable = new MyCallable();
FutureTask<Integer> task = new FutureTask<>(callable);
new Thread(task).start();
System.out.println("线程返回值:" + task.get());
}
}
呼び出し可能とrunableの違い:呼び出し可能な戻り値
二割り込み
- このスレッドがブロックされた状態にある場合、それの「割り込みステータスが」され、その割り込み()メソッドを呼び出しクリアし、InterruptedExceptionある例外を受け取ります。
例えば、割り込み()によるブロックされた状態と割り込みスレッドへのスレッド待ち()によって;)コール割り込み(スレッドフラグが「真」に設定され、割り込みが、すぐますスレッドがブロックされているので、いわゆる「ブレイクマークその「すぐにクリアされます偽同時に、それは例外:InterruptedException例外が生成されます。
- スレッドセレクタセレクタでブロックされている場合、()それによって、割り込み、割り込み、スレッド割り込みフラグがセットされtrueに、それは直ちに選択操作から返されます。
- あなたは前述のケースに属していない場合は、割り込み()割り込みのスレッドで、それは割り込みフラグがセットされますtrueに。
スレッドの道を終了
「ブロック」のスレッドで終了
InterruptedExceptionある、割り込みスレッドをキャプチャすることによりループを終了するには
終了は、スレッドで「ランニング」であります
終了は「マーク」を通じてスレッドで「ランニング」モードになっています。どちら含む中断标记
と额外添加标记
。
(01)によって中断标记
、スレッドを終了します
@Override
public void run() {
while (!isInterrupted()) {
// 执行任务...
}
}
(02)を介し额外添加标记
。
private volatile boolean flag= true;
protected void stopTask() {
flag = false;
}
@Override
public void run() {
while (flag) {
// 执行任务...
}
}
コンバイン
@Override
public void run() {
try {
// 1. isInterrupted()保证,只要中断标记为true就终止线程。
while (!isInterrupted()) {
// 执行任务...
}
} catch (InterruptedException ie) {
// 2. InterruptedException异常保证,当InterruptedException异常产生时,线程被终止。
}
}
違いは、(中断)とisInterruptedを()の
()とisInterruptedを()は、オブジェクトを検出するために使用することができ中断「割り込みフラグを。」
違いは、その外側の割り込みフラグを返すことに加えて)(中断された还会清除中断标记
(すぐに割り込みフラグがfalseに設定されている);およびisInterruptedを()仅仅
割り込みフラグを返します
参照
Javaのマルチスレッドシリーズ - 割り込みの「基本」09()とスレッドの終了モード
三つのスレッド状態
スレッドのパッケージには、次の5つの状態が含まれています。
- 新しい状態(新規):スレッドオブジェクトが作成されたら、新しい状態に入りました。たとえば、スレッドのスレッドが新しいスレッドを=()。
- レディ状態(Runnableを):としても知られている「実行可能状態。」スレッドオブジェクトを作成した後、他のスレッドがオブジェクトを呼び出す
start()方法
スレッドを起動することにより、。例えば、thread.start()。いつでも即応の状態をスレッドはCPUスケジューリングによって実行することができます。 - 実行状態(実行):実行するための許可を取得するためにCPUのスレッドを。なお、スレッドが実行されているだけの状態に準備完了状態から入力することができます。
- ブロックされた(ブロック):スレッドがCPUを使用する権利を放棄するためにいくつかの理由でブロックされて一時的に実行を停止します。レディ状態にスレッド、ランニング行く機会まで。サブの閉塞の場合3種類:
(01)-呼び出したスレッド()メソッドは、ジョブの完了を待つスレッドが待機待機をブロックします。
(02)同期ブロック- (ロックが別のスレッドによって占領されたため)スレッドは、同期ロックの失敗を同期します、それは同期ブロッキング状態になります。
(03)その他の障害物-スリープから()、または呼び出し元のスレッドを()に参加またはブロックされた状態にするI / O要求、スレッドを発行します。睡眠()タイムアウトは、参加()またはスレッドのタイムアウト待ちが終了するため、またはI / O処理は、準備完了状態にスレッドが再び完了しています。 - 死の状態(デッド):スレッドの実行は、run()メソッド、ライフサイクルの糸端を介して、または異常終了によるものです。
次の待ち状態がブロックされてブロックされたロックされているのはなぜ?
待ち時間がにされている必要があるので同步块中
そう目覚めた後に、使用、それは待つためにプールにロックされます。
参考:Javaのマルチスレッドシリーズ- 「基礎」01の基本的な考え方
一般的な4つの方法
睡眠和待ち
- 睡眠()(CPUリソースを解放します)ロックを解除しません。
wait()会释放对象锁
後にウェイクアップ、待ち時間は以下続きます。 - 待ち時間は、
必须在同步块中
それ以外の場合は、例外がスローされます実行しました。指定された通知されますかnotifyAlllや睡眠時間が目を覚ますために(3例) - 待ち時間があり
对象
、(そのオブジェクトのロックを解除します)スレッドのsleppの静的メソッド