현재 스레드가 깨어나거나 일반적으로 알림을 받거나 중단될 때까지 기다리거나 특정 실시간 시간이 경과할 때까지 기다리게 합니다.
소스 코드를 보면 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); }4의 함수입니다. functionboth 현재 스레드가 프로세서의 현재 사용을 포기할 의사가 있음을 스케줄러에 나타내는 Thread 클래스의 함수입니다. 스케줄러는 이 프롬프트를 무시할 수 있습니다. Yield는 CPU를 과도하게 사용하게 될 스레드 간의 상대적인 진행 상황을 개선하기 위한 경험적 시도입니다. 실제로 의도한 효과가 있는지 확인하기 위해 상세한 분석 및 벤치마킹과 함께 사용되어야 합니다. 이 방법을 사용하는 것은 거의 적절하지 않습니다. 경쟁 조건으로 인한 오류를 재현하는 데 도움이 될 수 있는 디버깅 또는 테스트 목적으로 사용될 수 있습니다. java.util.concurrent.locks 패키지와 같은 동시성 제어 구성을 설계할 때도 유용할 수 있습니다.
public static native void yield();일반적으로 항복 함수의 주요 기능은 다음과 같습니다. CPU 스케줄링 및 스레드 일시 중지를 포기하지만 시간은 사용자가 지정할 수 없습니다.실행 기회를 갖기 위해 동일한 우선순위만 허용할 수 있습니다5 . 요약대기 스레드를 일시 중지하고 CPU를 포기하고 잠금을 해제합니다. (객체 클래스) join은 스레드를 일시 중지하고 스레드를 실행한 후에만 자체 스레드로 돌아갈 수 있습니다. (스레드 클래스) sleep은 스레드를 일시 중지하고 잠금을 해제하지 않고 CPU를 포기합니다. (스레드 클래스) yield는 스레드를 일시 중지하지만 사용자가 지정할 수는 없으며 동일한 우선순위에 실행 기회만 부여할 수 있습니다. (스레드 클래스)5.1 wait와 Join의 차이점위의 소스 코드와 로직 코드를 읽은 후 둘 사이의 유사점과 차이점에 대해 이야기해 봅시다일반적으로 wait 함수: 현재 스레드를 넣습니다. 대기 상태가 되면 wait()가 inform() 및 informAll() 메소드와 함께 사용됩니다. 알림은 깨우기 기능입니다
차이점
클래스 | Object 클래스 | |
---|---|---|
용도 | 스레드 간 통신 | |
동기화 | 동기화해야 함 | |
5.2 대기와 수면의 차이 |
하지만 둘 다 CPU 리소스를 포기하게 됩니다
위 내용은 Java에서 일반적으로 사용되는 네 가지 스레드 함수는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!