1. 스레드 조인 :
스레드 실행 중에 큰 문제를 여러 개의 작은 문제로 나누고, 각각의 작은 문제에 스레드를 할당하는 등 다른 스레드가 먼저 실행되기를 원하지만 작은 문제가 모두 처리된 후에는 기본 스레드가 추가 작업을 수행하도록 하는 등의 경우가 있습니다. 이때 메인 스레드에 있는 다른 스레드의 Join() 메서드를 호출하여 호출 스레드(여기서는 메인 스레드)를 차단할 수 있습니다.
샘플 코드:
다음과 같이 코드 코드를 복사합니다.
패키지 org.frzh.thread;
공개 클래스 JoinThread는 Thread를 확장합니다.
//스레드 이름을 설정하기 위해 매개변수화된 생성자를 제공합니다.
공개 JoinThread(문자열 이름) {
슈퍼(이름);
}
공개 무효 실행() {
for (int i = 0; i < 100; i++) {
System.out.println(getName() + " " + i);
}
}
공개 정적 무효 메인(String[] args) {
//자식 스레드 시작
new JoinThread("새 스레드").start();
for (int i = 0; i < 100; i++) {
if (i == 20) {
JoinThread jt = new JoinThread("참여할 스레드");
jt.start();
//메인 스레드는 jt 스레드의 조인 메소드를 호출한 다음, 메인 스레드는 jt가 실행을 완료할 때까지 기다려야 실행할 수 있습니다.
노력하다 {
jt.join();
} 잡기(InterruptedException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + " " +i);
}
}
}
원래는 3개의 스레드 세트(2개의 하위 스레드와 1개의 메인 스레드)가 있었습니다. i=20이면 메인 스레드가 차단되고 "조인된 스레드"가 실행될 때까지 기다려야 실행될 수 있습니다. 그 이후에는 단 두 개의 스레드만 실행됩니다.
Join() 메소드의 세 가지 오버로드된 형태:
Join(): 조인된 스레드가 실행을 마칠 때까지 기다립니다.
Join(long millis): 조인된 스레드가 실행될 때까지 기다리는 가장 긴 시간은 밀리초입니다. 그 이후에는 조인된 스레드의 실행이 완료되지 않더라도 더 이상 기다리지 않습니다.
Join(long millis, int nanos): 조인된 스레드가 실행될 때까지 기다리는 최대 시간은 밀리초 + 나노 마이크로초입니다. (이 방법은 기본적으로 쓸모가 없습니다.)
2: 배경 스레드 :
백그라운드에서 실행되는 스레드가 있고 그 작업은 다른 스레드를 제공하는 것입니다. 이 스레드를 "백그라운드 스레드", "데몬 스레드" 또는 "elf 스레드"라고 합니다. 모든 전경 스레드가 죽으면 배경 스레드도 자동으로 죽습니다.
샘플 코드:
다음과 같이 코드 코드를 복사합니다.
패키지 org.frzh.thread;
공개 클래스 DaemonThread는 Thread를 확장합니다.
공개 무효 실행() {
for (int i = 0; i < 1000; i++) {
System.out.println(getName() + " " +i);
}
}
공개 정적 무효 메인(String[] args) {
DaemonThread dt = new DaemonThread();
//이 스레드를 백그라운드 스레드로 설정
dt.setDaemon(true);
dt.start();
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
//포그라운드 스레드가 종료되면 백그라운드 스레드 dt도 종료되므로 실행되지 않습니다. 999
}
}
기본 스레드는 기본적으로 전경 스레드로 설정되고, 전경 스레드에서 생성된 하위 스레드는 기본적으로 전경 스레드로 설정되며, 백그라운드 스레드에서 생성된 하위 스레드는 기본적으로 백그라운드 스레드로 설정됩니다.
3. 쓰레드 슬립(sleep):
이전 조인 방법은 계속하기 전에 호출 스레드가 조인된 스레드의 실행이 완료될 때까지 기다리도록 하는 것인 반면, sleep() 메서드는 호출 스레드가 준비 상태로 다시 들어가고 완료될 때까지 일정 시간 동안 차단하도록 하는 것입니다. 예정. 따라서 프로그램 실행을 일시 중지하는 데 자주 사용됩니다.
샘플 코드:
다음과 같이 코드 코드를 복사합니다.
패키지 org.frzh.thread;
java.util.Date 가져오기;
공개 클래스 SleepThread{
공개 정적 무효 메인(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println("현재 시간: " + new Date());
노력하다 {
Thread.sleep(1000);
} 잡기(InterruptedException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
}
}
}
sleep() 메소드의 두 가지 오버로딩 메소드:
static void sleep(long millis): 현재 스레드가 밀리초 동안 일시 중지되고 차단 상태로 들어가도록 합니다. 이 방법은 시스템 타이머와 스레드 스케줄러의 정밀도와 정확성에 영향을 받습니다.
static void sleep(long millis, int nanos): mills milliseconds + nanos microseconds를 일시 중지하고 차단 상태로 들어갑니다. 또한 시스템 타이머 및 스레드 스케줄러의 정확도와 정확성에 영향을 받습니다. 기본적으로 필요하지 않습니다.
4. 스레드 수율:
Yield() 메서드는 sleep 메서드와 다소 유사하며 현재 실행 중인 스레드를 일시 중지할 수도 있지만 스레드를 차단하지 않고 단지 준비 상태로 전환합니다(차단 상태가 아니라는 점에 유의하세요). Yield() 메소드는 우선순위가 같거나 더 높은 스레드에게만 실행될 기회를 제공하므로 이 메소드를 호출한 후 실행을 계속하도록 스레드를 다시 예약할 수 있습니다.
샘플 코드:
다음과 같이 코드 코드를 복사합니다.
패키지 org.frzh.thread;
공개 클래스 YieldThread는 Thread를 확장합니다.
공개 YieldThread() {
}
공개 YieldThread(문자열 이름) {
슈퍼(이름);
}
공개 무효 실행() {
for (int i = 0; i < 100; i++) {
System.out.println(getName() + " " +i);
if (i == 20) {
//현재 스레드가 결과를 산출합니다.
Thread.yield();
}
}
}
공개 정적 무효 메인(String[] args) {
//두 개의 동시 스레드 시작
YieldThread yt1 = new YieldThread("고급");
//yt1을 가장 높은 우선순위로 설정
yt1.setPriority(Thread.MAX_PRIORITY);
yt1.start();
YieldThread yt2 = new YieldThread("낮은 수준");
yt2.setPriority(Thread.MIN_PRIORITY);
yt2.start();
/*
* 스레드에 우선순위가 설정되지 않은 경우 두 스레드의 우선순위가 동일하므로 두 스레드가 교대로 실행되며, Yield가 호출되면 다른 스레드가 실행됩니다.
* 단, 두 스레드 각각에 대해 위의 우선순위를 설정한 후 바로 고급 스레드 실행이 시작됩니다. i=20일 경우에는 Yield 메소드만 호출되기 때문입니다.
* 우선순위가 동일하거나 더 높은 스레드에 실행 기회를 부여하여 이때 상위 스레드가 계속 실행되고 하위 스레드에는 주어지지 않도록 합니다.
*/
}
}
5: 스레드의 우선순위를 변경합니다 .
이는 비교적 간단합니다. 인스턴스 메소드 setPriority(int Priority) 메소드를 호출하면 됩니다. 각 스레드는 기본적으로 상위 스레드와 동일한 우선순위를 가지며 기본 스레드는 기본적으로 보통 우선순위(5)로 설정됩니다. Java는 1부터 10까지의 우선순위를 제공하며 세 가지 정적 상수를 사용할 수도 있습니다.
MAX_PRIORITY:10
MIN_PRIORITY:1
NORM_PRIORITY:5
참고: Java는 10개의 우선순위를 제공하지만 시스템마다 지원하는 우선순위가 다르므로 1에서 10 사이의 숫자를 직접 사용하지 말고 정적 상수를 사용하여 우수한 이식성을 보장하세요.