Thread.sleep()とThread.yield()の違いと関連

2802 ワード

JAVAコンカレントプログラムの開発では、この2つの方法でプログラムをテストすることがよくあります.同じ点は、1.現在のスレッドの実行を一時的に遅らせることです.2.すでにロックを持っている場合、待機中にロックは解放されません.
異なる点は、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();
}