현재 스레드가 깨어나거나 일반적으로 알림을 받거나 중단될 때까지 기다리거나 특정 실시간 시간이 경과할 때까지 기다리게 합니다.
소스 코드를 보면 public class Object {
소스 코드를 보면 세 가지 오버로드된 메소드가 있음을 알 수 있습니다.
//第一个重载函数 public final void wait() throws InterruptedException { wait(0L); } //第二个重载函数 public final native void wait(long timeoutMillis) throws InterruptedException; //第三个重载函数 public final void wait(long timeoutMillis, int nanos) throws InterruptedException { if (timeoutMillis < 0) { throw new IllegalArgumentException("timeoutMillis value is negative"); } if (nanos < 0 || nanos > 999999) { throw new IllegalArgumentException( "nanosecond timeout value out of range"); } if (nanos > 0 && timeoutMillis < Long.MAX_VALUE) { timeoutMillis++; } wait(timeoutMillis); }
구체적인 실제 호출 코드는 다음과 같습니다.
wait 함수가 실행되면 이 4초 내에 잠금이 해제되고 스레드가 일시 중지됩니다. 이 4초 내에 inform()에 협력하면 깨어나고 잠금을 얻을 수 있습니다. 깨어나지 않으면 다른 사람이 경쟁할 때까지 기다리십시오. 4초 후 기본적으로 잠금이 자동으로 해제됩니다
현재 스레드가 Thread.wait()를 기다리는 동안 스레드가 종료되면 자동으로 깨어나 자동으로 잠금을 해제할 수 있습니다
@Override public void run() { synchronized (a) { a.wait(4000); } }
//第一个重载函数 public final synchronized void join(final long millis) throws InterruptedException { if (millis > 0) { if (isAlive()) { final long startTime = System.nanoTime(); long delay = millis; do { wait(delay); } while (isAlive() && (delay = millis - TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime)) > 0); } } else if (millis == 0) { while (isAlive()) { wait(0); } } else { throw new IllegalArgumentException("timeout value is negative"); } } //第二个重载函数 /*等待该线程死亡的时间最多为毫秒加纳秒。 如果两个参数都为0,则意味着永远等待。 这个实现使用了This的循环。 等待电话以this.isAlive为条件。 当一个线程终止this。 调用notifyAll方法。 建议应用程序不要使用wait、notify或notifyAll on Thread实例。 */ public final synchronized void join(long millis, int nanos) throws InterruptedException { if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (nanos < 0 || nanos > 999999) { throw new IllegalArgumentException( "nanosecond timeout value out of range"); } if (nanos > 0 && millis < Long.MAX_VALUE) { millis++; } join(millis); } //第三个重载函数 /*等待线程死亡。 此方法的调用与调用的行为完全相同 InterruptedException—如果任何线程中断了当前线程。 当抛出此异常时,当前线程的中断状态将被清除。 */ public final void join() throws InterruptedException { join(0); }
/*根据系统计时器和调度器的精度和准确性, 使当前执行的线程在指定的毫秒数内处于睡眠状态(暂时停止执行)。 线程不会失去任何监视器的所有权。*/ public static native void sleep(long millis) throws InterruptedException; /*导致当前执行的线程在指定的毫秒数加上指定的纳秒数 (取决于系统计时器和调度器的精度和准确性)内休眠(暂时停止执行)。 线程不会失去任何监视器的所有权。 */ public static void sleep(long millis, int nanos) throws InterruptedException { if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (nanos < 0 || nanos > 999999) { throw new IllegalArgumentException( "nanosecond timeout value out of range"); } if (nanos > 0 && millis < Long.MAX_VALUE) { millis++; } sleep(millis); }
public static native void yield();
차이점
클래스 | Object 클래스 | |
---|---|---|
용도 | 스레드 간 통신 | |
동기화 | 동기화해야 함 | |
5.2 대기와 수면의 차이 |
하지만 둘 다 CPU 리소스를 포기하게 됩니다
위 내용은 Java에서 일반적으로 사용되는 네 가지 스레드 함수는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!