Thread.sleep()とThread.yield()の違いと関連
2802 ワード
JAVAコンカレントプログラムの開発では、この2つの方法でプログラムをテストすることがよくあります.同じ点は、1.現在のスレッドの実行を一時的に遅らせることです.2.すでにロックを持っている場合、待機中にロックは解放されません.
異なる点は、1.Thread.sleep()はスリープ時間を正確に指定することができ、Thread.yield()はCPUのタイムスライス区分に依存し、私のパソコンでは約20マイクロ秒である.2.Thread.sleep()は割り込み異常を放出し、割り込むことができるが、Thread.yield()はできない.
サンプル・プログラムは次のとおりです.
異なる点は、1.Thread.sleep()はスリープ時間を正確に指定することができ、Thread.yield()はCPUのタイムスライス区分に依存し、私のパソコンでは約20マイクロ秒である.2.Thread.sleep()は割り込み異常を放出し、割り込むことができるが、Thread.yield()はできない.
サンプル・プログラムは次のとおりです.
static class YieldLock extends Thread {
private Object monitor;
/**
* @param monitor
*/
@Inject
public YieldLock(Object monitor) {
this.monitor = monitor;
}
public void run() {
synchronized (monitor) {
while(true) {
Thread.yield();
}
}
}
}
static class MonitorLock extends Thread {
private Object monitor;
/**
* @param monitor
*/
@Inject
public MonitorLock(Object monitor) {
this.monitor = monitor;
}
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (monitor) {
System.out.println(" !");
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
final Object monitor = new Object();
new YieldLock(monitor).start();
//
// " !"
new MonitorLock(monitor).start();
}