スレッドの優先度とjoinメソッド
3111 ワード
優先度:
スレッドの優先度は、スレッドの重要性をスケジューラに渡します.CPUが既存のスレッドセットを処理する順序は不確定であるが,スケジューラは優先度が最も高いスレッドを先に実行する傾向にある.しかし、これは、優先度の低いスレッドが実行されないことを意味するものではなく(優先度にデッドロックは発生しません)、優先度の低いスレッドは実行頻度が低いだけです.Javaでは、スレッドの優先度は1~10の数字で表されます.数値が大きいほど、優先度が高いほど、デフォルトのスレッドの優先度は5です.JDKは10の優先度を設定していますが、多くのオペレーティングシステムとうまくマッピングできません.推奨される設定の優先度はMAX_ですPRIORITY、MIN_PRIORITY、NORM_PRIORITY.
優先度のコードの例は次のとおりです.
join
()メソッド:
1つのスレッドは、他のスレッド上でjoin()メソッドを呼び出すことができ、2番目のスレッドが終了するまで待機する効果があります.しかしjoin()メソッドの呼び出しは中断されてもよい.これはスレッド上のinterrupt()メソッドを呼び出すことである.例えば、スレッドBがスレッドAにjoin()メソッドを使用すると、スレッドAは、スレッドBの実行が完了した後に実行されるのを待つ.
t.join()tスレッドを実行させた後、メインスレッドを実行する.
t.join(time);メインスレッドをtimeミリ秒待ちにすると、tスレッドが実行されるかどうかにかかわらず、メインスレッドの内容が実行されます.
具体的なコードの例は次のとおりです.
テストt.join()
テストt.join(time)
スレッドの優先度は、スレッドの重要性をスケジューラに渡します.CPUが既存のスレッドセットを処理する順序は不確定であるが,スケジューラは優先度が最も高いスレッドを先に実行する傾向にある.しかし、これは、優先度の低いスレッドが実行されないことを意味するものではなく(優先度にデッドロックは発生しません)、優先度の低いスレッドは実行頻度が低いだけです.Javaでは、スレッドの優先度は1~10の数字で表されます.数値が大きいほど、優先度が高いほど、デフォルトのスレッドの優先度は5です.JDKは10の優先度を設定していますが、多くのオペレーティングシステムとうまくマッピングできません.推奨される設定の優先度はMAX_ですPRIORITY、MIN_PRIORITY、NORM_PRIORITY.
優先度のコードの例は次のとおりです.
package basic;
public class SimplePrioritis implements Runnable{
private int priority;
public SimplePrioritis(int priority){
this.priority = priority;
}
@Override
public void run() {
Thread.currentThread().setPriority(priority);
for(int i=0; i<5; i++){
System.out.println(Thread.currentThread().getName()+" ...");
// , cpu
Thread.yield();
}
}
public static void main(String[] args) {
Thread t1 = new Thread(new SimplePrioritis(Thread.MAX_PRIORITY));
Thread t2 = new Thread(new SimplePrioritis(Thread.MIN_PRIORITY));
t1.start();
t2.start();
}
}
join
()メソッド:
1つのスレッドは、他のスレッド上でjoin()メソッドを呼び出すことができ、2番目のスレッドが終了するまで待機する効果があります.しかしjoin()メソッドの呼び出しは中断されてもよい.これはスレッド上のinterrupt()メソッドを呼び出すことである.例えば、スレッドBがスレッドAにjoin()メソッドを使用すると、スレッドAは、スレッドBの実行が完了した後に実行されるのを待つ.
t.join()tスレッドを実行させた後、メインスレッドを実行する.
t.join(time);メインスレッドをtimeミリ秒待ちにすると、tスレッドが実行されるかどうかにかかわらず、メインスレッドの内容が実行されます.
具体的なコードの例は次のとおりです.
テストt.join()
package join;
/**
* System.out.println(a) , ,
* , start() , System.out.println(a),
* 0。 t.join() , 。
* @author Administrator
*
*/
public class JoinTest implements Runnable {
private static int a = 0;
@Override
public void run() {
try {
a = a + 1;
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Thread t = new Thread(new JoinTest());
t.start();
try {
// t.join() 0
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(a);
}
}
テストt.join(time)
package join;
public class RunnableImpl1 implements Runnable {
@Override
public void run() {
try {
System.out.println("begin sleep");
//TimeUnit.MICROSECONDS.sleep(100000);
Thread.sleep(10000);
System.out.println("end sleep");
} catch (Exception e) {
System.out.println(Thread.currentThread().getName()
+" is Interrupted"+Thread.interrupted());
}
}
}
package join;
/**
* t.join(1000) main() 1000 , t , 1000
* main , t , t.interrupt() 。
* @author Administrator
*/
public class JoinTest1 {
public static void main(String[] args) {
Thread t = new Thread(new RunnableImpl1());
t.start();
try {
t.join(1000);
//interrupt() 1000 ,
//t 。
t.interrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("finish sleep");
}
}