자바 다 중 스 레 드 join 의 역할 및 용법

JAVA 의 join 에 대해 JDK 는 이렇게 말 했다.join public final void join(long millis)throws Interrupted Exception Waits at most millis milliseconds for this thread to die.A timeout of 0 means to wait forever.이 스 레 드 가 죽 을 때 까지 기다 리 라 는 뜻 이다.
        이러한 응용 장면 이 있 습 니 다.메 인 스 레 드 가 몇 개의 하위 스 레 드 를 시작 하 는 동시에 일 을 해 야 합 니 다.메 인 스 레 드 는 이러한 하위 스 레 드 가 모두 끝 난 후에 야 아래로 실행 할 수 있 습 니 다(예 를 들 어 하위 스 레 드 의 결과 정 보 를 얻 으 려 면)
        이런 장면 에 직면 하여 우 리 는 몇 가지 생각 이 있다.
        1.하위 스 레 드 를 시작 한 후 주 스 레 드 sleep 를 일정 시간 동안 사용 합 니 다.
         이런 방식 은 가장 믿 을 수 없다.왜냐하면 우 리 는 메 인 스 레 드 를 얼마나 휴면 시 켜 야 할 지 모 르 기 때문이다.
        실례 1:
package com.bijian.study.thread;

public class MyThread extends Thread {

	boolean negative = true;
	double pi; // Initializes to 0.0, by default

	public void run() {
		for (int i = 3; i < 100000; i += 2) {
			
			if (negative)
				pi -= (1.0 / i);
			else
				pi += (1.0 / i);
			negative = !negative;
		}
		pi += 1.0;
		pi *= 4.0;
		System.out.println("Finished calculating PI");
	}
}

        주 루틴:
package com.bijian.study.thread;

public class MainThread {

	public static void main(String[] args) {
		MyThread mt = new MyThread();
		mt.start();
		try {
			Thread.sleep(10); // Sleep for 10 milliseconds
		} catch (InterruptedException e) {
		}
		System.out.println("pi = " + mt.pi);
	}
}

         실행 결과:
Finished calculating PI
pi = 3.1415726535897894

 
         2.sleep 한동안 믿 을 수 없 기 때문에 순환 을 해서 서브 스 레 드 가 살아 있 는 지 판단 할 수 있 습 니 다.
        인 스 턴 스 2(인 스 턴 스 1 의 메 인 스 레 드 수정):
package com.bijian.study.thread;

public class MainThread2 {

	public static void main(String[] args) {
		MyThread mt = new MyThread();
		mt.start();
		while (mt.isAlive())
			try {
				Thread.sleep(10); // Sleep for 10 milliseconds
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		System.out.println("pi = " + mt.pi);
	}
}

         실행 결과:
Finished calculating PI
pi = 3.1415726535897894

         이렇게 하면 효 과 는 달성 되 었 지만 메 인 스 레 드 에 순환 을 쓰 는 것 은 고성능 의 방법 이 아니다.
 
         3.join 이 응용 장면 을 잘 해결 합 니 다.
        인 스 턴 스 3(인 스 턴 스 1 의 메 인 스 레 드 수정):
package com.bijian.study.thread;

public class MainThread3 {
	public static void main(String[] args) {
		MyThread mt = new MyThread();
		mt.start();
		try {
			mt.join();
		} catch (InterruptedException e) {
		}
		System.out.println("pi = " + mt.pi);
	}
}

         실행 결과:
Finished calculating PI
pi = 3.1415726535897894

 
        인 스 턴 스 3 을 확장 하면 메 인 스 레 드 가 몇 개의 하위 스 레 드 를 시작 하 는 것 을 잘 해결 할 수 있 습 니 다.메 인 스 레 드 는 이 하위 스 레 드 가 모두 끝 난 후에 야 아래로 실 행 될 수 있 습 니 다.다음 과 같다.
          실례 4:
          1.하위 스 레 드 새로 만 들 기
package com.bijian.study.thread;

public class MyThread2 extends Thread {

	boolean negative = true;
	double res; // Initializes to 0.0, by default

	public void run() {
		for (int i = 1; i < 100; i += 2) {
			if (negative)
				res -= (1.0 / i);
			else
				res += (1.0 / i);
			negative = !negative;
		}
		System.out.println("Finished calculating res");
	}
}

         2.인 스 턴 스 1 의 메 인 스 레 드 수정
package com.bijian.study.thread;

public class MainThread3 {
	public static void main(String[] args) {
		
		//        1
		MyThread mt = new MyThread();
		mt.start();
		
		//        2
		MyThread2 mt2 = new MyThread2();
		mt2.start();
		try {
			mt.join();
			mt2.join();
		} catch (InterruptedException e) {
		}
		System.out.println("pi = " + mt.pi);
		System.out.println("res = " + mt2.res);
	}
}

         실행 결과:
Finished calculating res
Finished calculating PI
pi = 3.1415726535897894
res = -0.7803986631477527

좋은 웹페이지 즐겨찾기