>  기사  >  Java  >  Java에서 일반적으로 사용되는 네 가지 스레드 함수는 무엇입니까?

Java에서 일반적으로 사용되는 네 가지 스레드 함수는 무엇입니까?

WBOY
WBOY앞으로
2023-04-26 14:01:071345검색

1. wait()

현재 스레드가 깨어나거나 일반적으로 알림을 받거나 중단될 때까지 기다리거나 특정 실시간 시간이 경과할 때까지 기다리게 합니다.

소스 코드를 보면 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);      
       }
}

2.

join은 Thread 클래스 메소드입니다.

소스 코드를 확인하세요. 구체적인 소스 코드는 다음과 같습니다. 세 가지 오버로드된 메소드

//第一个重载函数
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);
 }

의 기본 시간 매개 변수 논리는 다음과 같습니다.

  • 은 0보다 작습니다. 던져진

  • 은 0과 같고, 조인(A)하고, A가 존재하는지 확인하고, 존재하는 경우에만 작업을 수행합니다. 이 스레드는 wait(0)을 실행하고 스레드 A가 끝나기 전에 실행이 끝날 때까지 기다립니다.

  • 는 0보다 크고 wait(long millis)를 실행한다는 점만 제외하면 위와 동일하며 작업은 계속할 수만 있습니다. 대기 시간이 끝난 후

3.sleep()

이전 대기 기능과 비교

  • sleep(long mills): CPU 자원을 포기하지만 잠금 자원을 해제하지 않습니다.

  • wait(): CPU 리소스를 포기하고 리소스를 잠급니다.

sleep 함수의 소스 코드 보기, 두 개의 오버로드된 함수가 있습니다

둘 모두 Thread 클래스

/*根据系统计时器和调度器的精度和准确性,
使当前执行的线程在指定的毫秒数内处于睡眠状态(暂时停止执行)。 
线程不会失去任何监视器的所有权。*/
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의 함수입니다. function

both 현재 스레드가 프로세서의 현재 사용을 포기할 의사가 있음을 스케줄러에 나타내는 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() 메소드와 함께 사용됩니다. 알림은 깨우기 기능입니다

  • join 기능: 자신의 스레드를 실행하기 전에 이 스레드가 끝날 때까지 기다리세요. 주요 기능은 동기화하여 스레드 간의 실행을 "병렬"에서 "직렬"로 변경하는 것입니다. 스레드 B의 Join() 메서드가 스레드 A에서 호출되면 스레드

  • 의 실행 프로세스가 변경됩니다. 스레드 A는 스레드 B가 실행을 계속하려면 실행이 완료될 때까지 기다려야 합니다.

    공통점:

일시 중지 현재 스레드

  • 는 인터럽트에 의해 깨울 수 있습니다.

  • 차이는 다음과 같습니다.

차이점

waitjoin 클래스 Object 클래스 스레드 클래스 용도 스레드 간 통신정렬, 순차적으로 통과시키자동기화동기화해야 함동기화를 사용할 수 없습니다잠깐( ): CPU 리소스를 포기하고 리소스를 잠급니다.
5.2 대기와 수면의 차이
sleep(long mills): CPU 리소스를 포기하지만 잠금 리소스는 해제되지 않습니다.

차이는 주로 CPU의 작동 메커니즘에 따라 다릅니다.

차이는 주로 두 가지 점을 고려합니다: 1. CPU가 계속 실행되는지 여부, 2. 잠금이 해제되는지 여부.

최종 분석에서:

wait,notify,notify는 모두 Object 개체의 메서드이며 함께 사용되며 잠금 메커니즘에 사용되므로 잠금이 해제됩니다.

그리고 sleep은 Thread 클래스입니다. 잠금과 관련이 없으며 잠금을 해제하지 않습니다

하지만 둘 다 CPU 리소스를 포기하게 됩니다

위 내용은 Java에서 일반적으로 사용되는 네 가지 스레드 함수는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제