자바 다 중 스 레 드 join 의 역할 및 용법
이러한 응용 장면 이 있 습 니 다.메 인 스 레 드 가 몇 개의 하위 스 레 드 를 시작 하 는 동시에 일 을 해 야 합 니 다.메 인 스 레 드 는 이러한 하위 스 레 드 가 모두 끝 난 후에 야 아래로 실행 할 수 있 습 니 다(예 를 들 어 하위 스 레 드 의 결과 정 보 를 얻 으 려 면)
이런 장면 에 직면 하여 우 리 는 몇 가지 생각 이 있다.
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.