まず、スレッドとプロセスの違い
1.スレッドは、実際に実行パスで、アプリケーションプロセスは、スタンドアロンアプリケーションです。
2. Aスレッド実行のパスで、複数の実行パスは、プロセスにおいて、同時に実行される、N、複数のスレッドが存在するであろう、すべてのスレッドの組を処理します。
3.マルチスレッド目的は、プログラムの効率を改善することです。
第二に、マルチスレッドアプローチを作成する(次の3つの方法は一例ずつではありません)
1.最初は、runメソッドをオーバーライドし、Threadクラスの継承です。
、Runnableインタフェースを実装する2、runメソッドをオーバーライドします。
3.匿名内部クラスを使用します。
第三に、デーモンスレッド
二つのスレッドで1.javaは、一方が他方のスレッドの保護者であり、ユーザスレッドです。
1.1ユーザ・スレッドが作成したユーザー定義のスレッドを指し、停止までメインスレッドは、ユーザスレッドを停止しません。
1.2。プロセスが存在するか、メインスレッドを停止しないデーモンスレッドは、スレッド・デーモンが停止されます。
2.は、setdaemonデーモンスレッドを設定する(true)メソッド
3.コード例
public class DaemonThread {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(100);
} catch (Exception e) {
// TODO: handle exception
}
System.out.println("我是子线程...");
}
}
});
thread.setDaemon(true);
thread.start();
for (int i = 0; i < 3; i++) {
try {
Thread.sleep(100);
} catch (Exception e) {
}
System.out.println("我是主线程");
}
System.out.println("主线程执行完毕!");
}
}
4.結果
4.1設定スレッド。は、setdaemon (trueに)、以下の結果:
我是子线程...
我是主线程
我是子线程...
我是主线程
我是子线程...
我是主线程
主线程执行完毕!
4.2が設定されていないスレッドを。は、setdaemon (trueに以下の結果は、(私は子スレッドでした...()を循環されています)、):
我是子线程...
我是主线程
我是子线程...
我是主线程
我是子线程...
我是主线程
主线程执行完毕!
我是子线程...
我是子线程...
我是子线程...
第四に、マルチスレッド動作状態
1.画像の決意
新しい状態、レディ状態、状態を実行している状態を遮断し、死の状態:常に次の5つのいずれかの状態で最後まで実行作成、から通します。
2.各状態の分析
2.1新しい状態:スレッドが新しいオペレータ、例えば、新しいスレッド(R)を使用して作成された場合、スレッドは、この場合には、新しいスレッドの状態を実行するために開始されていません。スレッドは、新生状態、まだスレッドを実行開始されていないプログラムコードである場合には
2.2準備状態:新しく作成されたスレッドは、スレッドはstart()メソッドを呼び出す必要があり、スレッドを実行するために、自動的に起動しません。あるスレッドを開始するスレッドオブジェクトのstart()メソッドを呼び出すとき、start()メソッドを実行しているシステムリソースのスレッドを作成し、スケジュールのスレッドが()メソッドを実行して実行します。start()メソッドが戻った後、スレッドが準備完了状態にあります。即応の状態は必ずしもすぐに実行()メソッドを実行していない、彼らは唯一のスレッドを実行している得ることができる前に、スレッドはまた、他のスレッドのCPU時間とCPU時間を競争しなければならないスレッド。コンピュータシステム内の単一のCPUが、それは同時に複数のスレッドを実行することは不可能であるため、1時間だけのスレッドが実行されています。したがって、この時点で、レディ状態にある複数のスレッドがあるかもしれません。レディ状態にある複数のスレッドがで決定されたJavaランタイムシステムのスレッドスケジューラ(スレッドスケジューラスケジュール)。
2.3動作状態:それは操作に入った前にスレッドが、CPU時間を取得し、本当に始まっrun()メソッド。
2.4閉塞状態:動作中のスレッドは、様々な理由にブロックされた状態に入ることができる:
方法睡眠を呼び出すことで、スリープ1>スレッド;
2>呼び出すスレッドがI / O操作でブロックされている、すなわち、入力操作出力動作は、呼び出し元が完了するまでには戻りません。
ロックを取得しようとしている3>スレッドが、ロックが別のスレッドによって保持されている;
4>スレッドがトリガ条件を待っています。
2.5死の状態:2つの理由がありますなぜスレッド死:
1)RUNメソッドが終了正常と自然死。
2)キャッチされない例外は、スレッドのrunメソッド突然死を終了します。
生きている現在のスレッド(ある、いずれかのいずれかで実行することができるブロックされる)かどうかを決定するために、のisAliveメソッドを使用します。あなたが実行しているか、ブロックされている場合は、trueを返します。スレッドはまだ新しく、状態を実行していない、またはスレッドの死は、偽が返された場合。
五、join()メソッド
たとえば、1:のメインスレッドt1.join()メソッドは、それが実行を右T1を与えるべきであることをメインスレッドを実行します。
2.コードケース:
public class DaemonThread {
public static void main(String[] args) throws Exception {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(10);
} catch (Exception e) {
}
System.out.println(Thread.currentThread().getName() + "i:" + i);
}
}
});
t1.start();
// 当在主线程当中执行到t1.join()方法时,就认为主线程应该把执行权让给t1
t1.join();
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(10);
} catch (Exception e) {
}
System.out.println("main" + "i:" + i);
}
}
}
3.結果
Thread-0i:0
Thread-0i:1
Thread-0i:2
Thread-0i:3
Thread-0i:4
Thread-0i:5
Thread-0i:6
Thread-0i:7
Thread-0i:8
Thread-0i:9
maini:0
maini:1
maini:2
maini:3
maini:4
maini:5
maini:6
maini:7
maini:8
maini:9
4.分析:最初の子スレッドは、サブスレッドの実行が完了した後にメインスレッドを実行し、メインスレッドの譲歩を終了します。
六小さな福祉
1.プロセスとスレッドの違いは?
A:プロセスは、すべてのスレッドの組であり、各スレッドは、実行プロセスのパスが、スレッドの実行パス。
2.なぜ使用マルチスレッド?
A:効率を改善するためのプログラム
3. Threadクラスの継承が良いですか実装Runnableの良いインタフェースを?
A:実装はインターフェースに継承させ続けることができるので、Runnableインタフェースは、良いです。Threadクラスの継承は継承できません。
THE OF結論
1.上映の記事では、マルチスレッドの安全性の問題と解決策を説明します。
2.粘り強いです!!!ハハッハッハ~~~