マルチスレッドのいくつかの小さな問題のまとめ
1、スレッドが死亡してから再起動できない
スレッドが死んだかどうかをテストするisAlive()メソッドを呼び出すことができます.スレッドが準備完了、実行、ブロックの3つの状態にある場合、trueを返します.スレッドが死亡し、新規状態にある場合falseが返されます.
インスタンスコードは次のとおりです.
package com.thread;
public class StartDead extends Thread{
private int i;
@Override
public void run() {
for(;i<100;i++){
System.out.println(getName()+" "+i);
}
}
public static void main(String[] args) {
//
StartDead sd=new StartDead();
for(int i=0;i<300;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
if(i==20){
// 】
sd.start();
// isAlive() , true
System.out.println(sd.isAlive());
}
// 、 ,isAlive() false
if(i>20&&!sd.isAlive()){
//
try {
sd.start();
} catch (Exception e) {
System.out.println(sd.getName()+" , !");
} }
}
}
}
上のコードを実行すると、死んだスレッドに対してstart()メソッドを呼び出すと異常が放出されることがわかります.
注意:すでに死んでいるスレッドに対してstart()メソッドを呼び出さないでください.プログラムは新しい状態のスレッドに対してstart()メソッドを呼び出すしかありません.新しいスレッドに対してstart()メソッドを2回呼び出すのも間違っています.
2.制御スレッドの実行
2.1 join()メソッド
join()メソッドには3つのリロード方式があります.
join():joinのスレッドの実行が完了するのを待つ.
join(long millis):joinを待つ時間が最も長いのは..millis.もし...millis内では、join()のスレッドがまだ完成していないので、待たないと言います.
join(long millis,int nanos):joinを待つスレッドが最も長いのは..millisミリ秒にnanosマイクロ秒を加える.
では、具体的な例を見てみましょう.
package com.thread;
public class JoinThread{
public static void main(String[] args) {
//
Thread t1=new Thread(new MyJoinThread()," ");
t1.start();
//
for(int i=0;i<100;i++){
if(i==20){
Thread t2=new Thread(new MyJoinThread()," Join ");
t2.start();
try {
//mian t2 join() ,main t2 .
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
class MyJoinThread implements Runnable {
// run() ,
public void run() {
for (int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
出力の結果は、実行するたびに異なります.
14
main 16
main 17
main 18
main 19
15
16
17
18
19
20
21
22
23
24
25
26
Join 0
27
Join 1
Join 2
以上の結果から,メインスレッドのi=20の場合,joinのスレッドによって実行されるまでメインスレッドがブロックされることが分かる.i=20までは「新規スレッド」と「main」スレッドが交互に実行する、i=20以降は「新規スレッド」と「joinスレッドが交互に実行する」.
2.2.バックグラウンドスレッド
スレッドをバックグラウンドスレッドに設定する場合は、スレッドが起動する前に設定する必要があります.つまり、start()メソッドはsetDaemon(true)メソッドの後に設定する必要があります.そうしないと、例外が放出されます.
2.3スレッドスリープ
static void sleep(long millis)は、現在実行中のスレッドにmillisミリ秒を一時停止させ、ブロック状態にします.sleep()を呼び出すと、オブジェクトロックは解放されません.
package com.thread;
public class ThreadSleep {
public static void main(String[] args) {
Thread t=new Thread(new MySleep());
t.start();
}
}
class MySleep implements Runnable{
public void run() {
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
他にもいくつかの小さな問題がありますが、時間があれば補充しましょう.