java 다중 루틴 프로그래밍의 루틴에서 데이터를 되돌리는 두 가지 방법

2649 단어 다중 스레드
1. 클래스 변수와 방법을 통해 데이터를 되돌려준다
이런 방법으로 데이터를 되돌려주는 데는 start 방법을 호출한 후에야 클래스 변수나 방법을 통해 데이터를 얻을 수 있다.우선 정기 2-13이 어떤 결과를 얻을지 봅시다.

package mythread;

public class MyThread extends Thread
{
    private String value1;
    private String value2;

    public void run()
    {
        value1 = " ";
        value2 = " ";
    }
    public static void main(String[] args) throws Exception
    {
        MyThread thread = new MyThread();
        thread.start();
        System.out.println("value1:" + thread.value1);
        System.out.println("value2:" + thread.value2);
    }
}

위의 코드를 실행하면 다음과 같은 결과를 출력할 수 있습니다

value1:null
value2:null
위의 운행 결과를 보면 매우 비정상적이다.run 방법에서value1과value2에 값을 부여했는데 되돌아오는 것은null입니다.이런 상황이 발생한 이유는 start 방법을 호출한 후 바로value1과value2의 값을 출력했기 때문이다. 여기에run 방법은value1과value2의 값을 부여하는 문장에 실행되지 않았기 때문이다.이런 상황을 피하려면run 방법이 실행된 후에value1과value2의 코드를 출력해야 합니다.따라서, 우리는sleep 방법을 사용하여 주 라인을 지연시킬 수 있다. 예를 들어thread에서.start() 다음에 다음과 같은 문장을 한 줄 추가합니다:sleep(1000);이렇게 하면 주 라인을 1초 늦춘 후에 다시 아래로 실행할 수 있지만, 이렇게 하면 문제가 하나 있다. 바로 우리가 얼마나 늦춰야 할지 어떻게 알겠는가이다.이 예의run방법에는 두 개의 부치문장만 있고 하나의 라인만 만들어졌기 때문에 1초의 지연이 충분하지만 run방법의 문장이 복잡하면 이 시간은 예측하기 어려워서 이런 방법은 불안정하다.우리의 목적은value1과value2의 값을 얻는 것입니다. 따라서value1과value2가null인지 아닌지만 판단하면 됩니다.만약 그것들이null이 아니라면, 이 두 값을 출력할 수 있습니다.우리는 다음과 같은 코드를 사용하여 이 목적을 달성할 수 있다

while (thread.value1 == null || thread.value2 == null);
위의 문장을 사용하면 이런 상황을 안정적으로 피할 수 있지만 이런 방법은 시스템 자원을 너무 소모한다.만약run 방법의 코드가 복잡하다면value1과value2는 값을 부여하는 데 시간이 오래 걸릴 것이다. 이러면while 순환은value1과value2가 비어 있지 않을 때까지 계속 실행해야 한다.따라서 우리는 위의 문장에 대해 다음과 같은 개선을 할 수 있다

while (thread.value1 == null || thread.value2 == null)
    sleep(100);
while 순환에서 1차value1과value2의 값을 판단한 후 100밀리초 동안 휴면한 후에 이 두 값을 판단한다.이렇게 점용하는 시스템 자원은 좀 작을 것이다.위의 방법은 잘 해결할 수 있지만 자바의 스레드 모델은 우리에게 더 좋은 해결 방안을 제공했다. 이것이 바로 Join 방법이다.앞에서 언급한 바와 같이join의 기능은 라인을 사용하여 비동기적인 실행에서 동기화된 실행으로 전환하는 것이다.루틴이 동기화 실행으로 바뀌면 일반적인 방법에서 데이터를 되돌리는 것과 다를 것이 없다.따라서 다음과 같은 코드를 사용하여 이 문제를 더욱 효과적으로 해결할 수 있다

thread.start();
thread.join();
thread.join () 가 실행된 후, 스레드thread의run 방법은 이미 종료되었습니다. 즉, 스레드thread가 끝났다는 것입니다.그래서thread.join () 뒤에는 MyThread 클래스의 모든 자원을 사용하여 데이터를 되돌려 받을 수 있습니다.
둘째, 리셋 함수를 통해 데이터를 되돌려주는 방법은 사실 에서 소개되었다.이라는 문장의 예에서Work류의process방법을 통해 라인에 계산결과를 전달했지만,process방법을 통해 라인에서 세 개의 랜덤수를 얻었다.따라서 이런 방법은 라인에 데이터를 전달할 수도 있고 라인에서 데이터를 얻을 수도 있다.

좋은 웹페이지 즐겨찾기