1. 클래스 변수와 메소드를 통해 데이터를 반환합니다.
이 메서드를 사용하여 데이터를 반환하려면 클래스 변수나 메서드를 통해 데이터를 얻기 전에 start 메서드를 호출해야 합니다. 먼저 예제 2-13에서 얻은 결과를 살펴보겠습니다.
다음과 같이 코드 코드를 복사합니다.
패키지 신화 읽기;
공개 클래스 MyThread는 Thread를 확장합니다.
{
개인 문자열 값1;
개인 문자열 값2;
공개 무효 실행()
{
value1 = "멤버변수를 통해 데이터를 반환합니다.";
value2 = "멤버 메소드를 통해 데이터를 반환합니다.";
}
public static void main(String[] args)에서 예외가 발생했습니다.
{
MyThread 스레드 = 새로운 MyThread();
thread.start();
System.out.println("value1:" + thread.value1);
System.out.println("value2:" + thread.value2);
}
}
위 코드를 실행하면 다음과 같은 결과가 출력될 수 있습니다.
다음과 같이 코드 코드를 복사합니다.
값1:널
값2:널
위의 실행 결과는 매우 비정상적으로 보입니다. run 메소드에서 value1, value2에 값을 할당했는데 null이 반환됩니다. 이렇게 되는 이유는 start 메소드를 호출한 직후에 value1과 value2의 값이 출력되는데, 여기서 run 메소드는 아직 value1과 value2에 값을 할당하는 명령문을 실행하지 않았기 때문입니다. 이러한 상황을 방지하려면 value1과 value2를 출력하는 코드를 실행하기 전에 run 메서드가 실행될 때까지 기다려야 합니다. 따라서 메인 스레드를 지연시키기 위해 sleep 메소드를 사용하는 것을 생각할 수 있습니다. 예를 들어, thread.start() 뒤에 다음 명령문을 추가할 수 있습니다.
수면(1000);
이렇게 하면 계속하기 전에 메인 스레드가 1초 동안 실행을 지연시킬 수 있지만 여기에는 문제가 있습니다. 즉, 얼마나 오래 지연되는지 어떻게 알 수 있습니까? 이 예에서는 run 메소드에 할당문이 2개만 있고 스레드가 하나만 생성되므로 1초의 지연이면 충분하지만 run 메소드의 명령문이 복잡하면 이 시간을 예측하기 어렵습니다. 따라서 이 방법은 안정적이지 않습니다.
우리의 목적은 value1과 value2의 값을 얻는 것이므로 value1과 value2가 null인지 여부만 확인하면 됩니다. 둘 중 어느 것도 null이 아니면 이 두 값이 출력될 수 있습니다. 이 목적을 달성하기 위해 다음 코드를 사용할 수 있습니다.
다음과 같이 코드 코드를 복사합니다.
while(thread.value1 == null || thread.value2 == null);
위의 설명을 사용하면 이러한 상황을 매우 안정적으로 피할 수 있지만 이 방법은 시스템 리소스를 너무 많이 소모합니다. run 메소드의 코드가 매우 복잡하다면 value1과 value2를 할당하는 데 오랜 시간이 걸리므로 value1과 value2가 모두 비어 있지 않을 때까지 while 루프를 계속 실행해야 한다고 상상할 수 있습니다. 따라서 위의 설명을 다음과 같이 개선할 수 있습니다.
다음과 같이 코드 코드를 복사합니다.
while (thread.value1 == null || thread.value2 == null)
수면(100);
while 루프에서는 처음으로 value1과 value2의 값을 판단한 후 100밀리초 동안 sleep한 후 이 두 값을 판단합니다. 이렇게 하면 시스템 리소스를 덜 차지하게 됩니다.
위의 방법은 매우 잘 해결될 수 있지만 Java의 스레딩 모델은 조인 방법이라는 더 나은 솔루션을 제공합니다. 앞에서 설명한 것처럼 조인의 기능은 스레드를 사용하여 비동기 실행에서 동기 실행으로 변경하는 것입니다. 스레드가 동기적으로 실행되면 일반 메서드에서 반환 데이터를 가져오는 것과 다르지 않습니다. 따라서 이 문제는 다음과 같은 코드를 사용하여 보다 효율적으로 해결할 수 있습니다.
다음과 같이 코드 코드를 복사합니다.
thread.start();
thread.join();
thread.join()이 실행된 후 스레드 스레드의 run 메소드가 종료되었습니다. 이는 스레드 스레드가 종료되었음을 의미합니다. 따라서 thread.join() 이후에 MyThread 클래스의 모든 리소스를 안전하게 사용하여 반환된 데이터를 얻을 수 있습니다.
2. 콜백 함수를 통해 데이터를 반환합니다.
실제로 이 방법은 "스레드에 데이터를 전달하는 세 가지 방법"에서 소개되었습니다. "스레드에 데이터를 전달하는 세 가지 방법" 기사의 예에서는 계산 결과가 Work 클래스의 프로세스 메서드를 통해 스레드에 전달되지만 동시에 3개의 난수도 스레드에서 획득됩니다. 처리 방법. 따라서 이 메서드는 스레드에 데이터를 전달하고 스레드에서 데이터를 얻을 수 있습니다.