자바 다 중 스 레 드 초보 자 가이드(4):스 레 드 의 수명 주기
8906 단어 튜 토리 얼-다 중 스 레 드 입문
//
public void start( );
public void run( );
//
public void resume( ); //
public void suspend( ); //
public static void sleep(long millis);
public static void sleep(long millis, int nanos);
//
public void stop( ); //
public void interrupt( );
//
public boolean isAlive( );
public boolean isInterrupted( );
public static boolean interrupted( );
// join
public void join( ) throws InterruptedException;
[b]1.스 레 드 를 만 들 고 실행 합 니 다[/b]
스 레 드 가 만들어 진 후 run 방법의 코드 를 바로 실행 하지 않 고 대기 상태 에 있 습 니 다.스 레 드 가 대기 상태 일 때 스 레 드 클래스 의 방법 으로 스 레 드 의 우선 순위(setPriority),스 레 드 이름(setName),스 레 드 의 종류(setDaemon)등 여러 가지 속성 을 설정 할 수 있 습 니 다.
start 방법 을 호출 한 후,라인 은 run 방법의 코드 를 실행 하기 시작 합 니 다.라인 이 운행 상태 에 들어가다.Thread 류 의 isAlive 방법 을 통 해 스 레 드 가 실행 중인 지 여 부 를 판단 할 수 있 습 니 다.스 레 드 가 실행 상태 일 때 isAlive 는 true 로 돌아 갑 니 다.isAlive 가 false 로 돌아 갈 때 스 레 드 가 대기 상태 일 수도 있 고 정지 상태 일 수도 있 습 니 다.다음 코드 는 스 레 드 의 생 성,실행,정지 세 상태 사이 의 전환 을 보 여 주 며 해당 하 는 isAlive 반환 값 을 출력 합 니 다.
package chapter2;
public class LifeCycle extends Thread
{
public void run()
{
int n = 0;
while ((++n) < 1000);
}
public static void main(String[] args) throws Exception
{
LifeCycle thread1 = new LifeCycle();
System.out.println("isAlive: " + thread1.isAlive());
thread1.start();
System.out.println("isAlive: " + thread1.isAlive());
thread1.join(); // thread1
System.out.println("thread1 !");
System.out.println("isAlive: " + thread1.isAlive());
}
}
주의해 야 할 것 은 위의 코드 에서 join 방법 을 사 용 했 습 니 다.이 방법의 주요 기능 은 스 레 드 의 run 방법 이 완 료 된 후에 야 프로그램 이 계속 실 행 될 수 있 도록 하 는 것 입 니 다.이 방법 은 뒤의 글 에서 소개 할 것 입 니 다.
위 코드 의 실행 결과:
isAlive: false
isAlive: true
thread1 !
[b]2.스 레 드 를 걸 고 깨 우기[/b]
스 레 드 가 run 방법 을 실행 하기 시작 하면 이 run 방법 이 실 행 될 때 까지 이 스 레 드 를 실행 하고 나 서 야 종료 합 니 다.그러나 스 레 드 를 실행 하 는 과정 에서 두 가지 방법 으로 스 레 드 를 일시 적 으로 정지 시 킬 수 있다.이 두 가지 방법 은 suspend 와 sleep 입 니 다.suspend 를 사용 하여 스 레 드 를 걸 면 resume 방법 으로 스 레 드 를 깨 울 수 있 습 니 다.한편,sleep 를 사용 하여 스 레 드 를 휴면 시 킨 후 설 정 된 시간 후에 스 레 드 를 준비 상태 로 만 들 수 있 습 니 다(스 레 드 휴면 이 끝 난 후에 스 레 드 가 바로 실행 되 는 것 이 아니 라 준비 상태 에 들 어가 시스템 이 예약 되 기 를 기다 리 고 있 습 니 다).
suspend 와 resume 은 스 레 드 를 편리 하 게 걸 고 깨 울 수 있 지만 이 두 가지 방법 을 사용 하면 예측 할 수 없 는 일이 발생 할 수 있 기 때문에 이 두 가지 방법 은 deprecated(항의)로 표 시 됩 니 다.이 는 향후 jdk 버 전에 서 이 두 가지 방법 이 삭 제 될 수 있 음 을 나타 내 므 로 이 두 가지 방법 으로 스 레 드 를 조작 하지 않도록 하 는 것 입 니 다.다음 코드 는 sleep,suspend,resume 세 가지 방법 을 보 여 줍 니 다.
package chapter2;
public class MyThread extends Thread
{
class SleepThread extends Thread
{
public void run()
{
try
{
sleep(2000);
}
catch (Exception e)
{
}
}
}
public void run()
{
while (true)
System.out.println(new java.util.Date().getTime());
}
public static void main(String[] args) throws Exception
{
MyThread thread = new MyThread();
SleepThread sleepThread = thread.new SleepThread();
sleepThread.start(); // sleepThread
sleepThread.join(); // sleepThread 2
thread.start();
boolean flag = false;
while (true)
{
sleep(5000); // 5
flag = !flag;
if (flag)
thread.suspend();
else
thread.resume();
}
}
}
겉으로 볼 때 sleep 와 suspend 를 사용 하면 효과 가 비슷 하지만 sleep 방법 은 suspend 와 같 지 않 습 니 다.이들 사이 의 가장 큰 차이 점 은 하나의 스 레 드 에서 suspend 방법 으로 다른 스 레 드 를 걸 수 있 습 니 다.예 를 들 어 상기 코드 에서 메 인 스 레 드 에 thread 스 레 드 를 걸 수 있 습 니 다.sleep 는 현재 실행 중인 스 레 드 에 만 작 동 합 니 다.위 코드 에 서 는 각각 sleepThread 와 메 인 스 레 드 를 2 초,5 초 동안 휴면 시 켰 다.sleep 를 사용 할 때 는 한 스 레 드 에서 다른 스 레 드 를 휴면 할 수 없 음 을 주의해 야 합 니 다.예 를 들 어 main 방법 에서 thread.sleep(2000)방법 을 사용 하면 thread 스 레 드 를 2 초 동안 휴면 시 킬 수 없고 메 인 스 레 드 를 2 초 동안 만 휴면 시 킬 수 있 습 니 다.
[b]sleep 방법 을 사용 할 때 두 가지 주의 가 필요 합 니 다.[/b]
1.sleep 방법 은 두 가지 과부하 형식 이 있 는데 그 중 하 나 는 밀리초 를 설정 할 수 있 을 뿐만 아니 라 나 초(1,000,000 나 초 는 1 밀리초)도 설정 할 수 있다.그러나 대부분의 운영 체제 플랫폼 의 자바 가상 머 신 은 나 초 까지 정확 하지 않 기 때문에 sleep 에 나 초 를 설정 하면 자바 가상 머 신 은 이 값 에 가장 가 까 운 밀리초 를 가 져 옵 니 다.
2.sleep 방법 을 사용 할 때 throws 나 try{를 사용 해 야 합 니 다...................................................................sleep 방법의 정 의 는 다음 과 같다.
public static void sleep(long millis) throws InterruptedException
public static void sleep(long millis, int nanos) throws InterruptedException
[b]3.스 레 드 를 종료 하 는 세 가지 방법[/b]
스 레 드 를 중지 시 킬 수 있 는 세 가지 방법 이 있다.
1.종료 표 지 를 사용 하여 스 레 드 를 정상적으로 종료 합 니 다.즉,run 방법 이 완 료 된 후에 스 레 드 가 종 료 됩 니 다.
2.stop 방법 을 사용 하여 스 레 드 를 강제로 종료 합 니 다.(이 방법 은 사용 하 는 것 을 추천 하지 않 습 니 다.stop 은 suspend,resume 과 마찬가지 로 예측 할 수 없 는 결과 가 발생 할 수 있 기 때 문 입 니 다)
3.interrupt 방법 으로 스 레 드 를 중단 합 니 다.
[b]1.종료 표지 로 스 레 드 종료[/b]
run 방법 이 실행 되면 스 레 드 가 종 료 됩 니 다.하지만 때로는 run 방법 은 영원히 끝나 지 않 는 다.예 를 들 어 서버 프로그램 에서 스 레 드 를 사용 하여 클 라 이언 트 요청 을 감청 하거나 다른 순환 처리 가 필요 한 작업 을 수행 합 니 다.이러한 상황 에서 일반적으로 이 임 무 를 while 순환 과 같은 순환 에 두 는 것 이다.순환 을 영원히 실행 시 키 려 면 while(true){...}을 사용 하여 처리 할 수 있 습 니 다.그러나 while 순환 을 특정한 조건 에서 종료 시 키 려 면 가장 직접적인 방법 은 boolean 형식의 로 고 를 설정 하고 이 로 고 를 true 나 false 로 설정 하여 while 순환 이 종료 되 는 지 여 부 를 제어 하 는 것 입 니 다.다음은 종료 로 고 를 이용 하여 스 레 드 를 종료 하 는 예 를 보 여 줍 니 다.
package chapter2;
public class ThreadFlag extends Thread
{
public volatile boolean exit = false;
public void run()
{
while (!exit);
}
public static void main(String[] args) throws Exception
{
ThreadFlag thread = new ThreadFlag();
thread.start();
sleep(5000); // 5
thread.exit = true; // thread
thread.join();
System.out.println(" !");
}
}
위 코드 에서 종료 표지 exit 를 정의 합 니 다.exit 가 true 일 때 while 순환 종료,exit 의 기본 값 은 false 입 니 다.exit 를 정의 할 때 자바 키워드 volatile 을 사 용 했 습 니 다.이 키 워드 는 exit 를 동기 화 하 는 것 이 목적 입 니 다.즉,같은 시간 에 하나의 스 레 드 로 만 exit 의 값 을 수정 할 수 있 습 니 다.
[b]2.stop 방법 으로 스 레 드 종료[/b]
stop 방법 을 사용 하면 실행 중인 스 레 드 를 강제로 종료 할 수 있 습 니 다.우 리 는 다음 과 같은 코드 를 사용 하여 스 레 드 를 종료 할 수 있 습 니 다.
thread.stop();
위의 코드 를 사용 하면 스 레 드 를 종료 할 수 있 지만 stop 방법 을 사용 하 는 것 은 위험 합 니 다.정상 적 인 프로그램 이 아 닌 컴퓨터 전원 을 갑자기 끄 는 것 처럼 예상 치 못 한 결과 가 발생 할 수 있 으 므 로 stop 방법 으로 스 레 드 를 종료 하 는 것 을 추천 하지 않 습 니 다.
[b]3.interrupt 방법 으로 스 레 드 를 종료 합 니 다[/b]
interrupt 방법 을 사용 하여 터미널 스 레 드 를 두 가지 상황 으로 나 눌 수 있 습 니 다.
(1)스 레 드 가 차단 상태 에 있 습 니 다.예 를 들 어 sleep 방법 을 사용 한 경우.
(2)while(!isInterrupted(){...}스 레 드 가 중단 되 었 는 지 판단 합 니 다.
첫 번 째 상황 에서 interrupt 방법 을 사용 하면 sleep 방법 은 Interrupted Exception 예 외 를 던 지고 두 번 째 상황 에서 스 레 드 는 직접 종료 합 니 다.다음 코드 는 첫 번 째 상황 에서 interrupt 방법 을 사용 하 는 것 을 보 여 줍 니 다.
package chapter2;
public class ThreadInterrupt extends Thread
{
public void run()
{
try
{
sleep(50000); // 50
}
catch (InterruptedException e)
{
System.out.println(e.getMessage());
}
}
public static void main(String[] args) throws Exception
{
Thread thread = new ThreadInterrupt();
thread.start();
System.out.println(" 50 !");
System.in.read();
thread.interrupt();
thread.join();
System.out.println(" !");
}
}
위의 코드 의 운행 결 과 는 다음 과 같다.
50 !
sleep interrupted
!
interrupt 방법 을 호출 한 후 sleep 방법 에 이상 을 던 진 다음 오류 정 보 를 출력 합 니 다:sleep interrupted.
메모:Thread 클래스 에서 스 레 드 가 interrupt 방법 으로 종료 되 었 는 지 여 부 를 판단 할 수 있 는 두 가지 방법 이 있 습 니 다.하 나 는 정적 인 방법 인 터 럽 트()입 니 다.하 나 는 비 정적 인 방법 인 isInterrupted()입 니 다.이 두 가지 방법의 차 이 는 interrupted 가 현재 선 이 중단 되 었 는 지 여 부 를 판단 하 는 데 사 용 됩 니 다.isInterrupted 는 다른 스 레 드 가 중단 되 었 는 지 여 부 를 판단 할 수 있 습 니 다.그래서 while(!isInterrupted()도 while(!Thread.interrupted())。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Weave Scope 다 중 호스트 모니터링 - 매일 5 분 씩 Docker 용기 기술 돌리 기 (81)이 host 아이콘 을 누 르 면 자세 한 정 보 를 표시 합 니 다. host 현재 자원 사용 현황 과 역사 곡선 이 한눈 에 들 어 옵 니 다.이외에 도 host 에서 실행 중인 프로 세 스 와 용기 목록 을 편...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.