>  기사  >  Java  >  Java 예제 - 스레드 상태 가져오기

Java 예제 - 스레드 상태 가져오기

黄舟
黄舟원래의
2017-01-20 11:22:581903검색

Java 스레드의 수명 주기는 대략 5가지 상태로 나눌 수 있습니다.

1. 새로운 상태(New): 새로운 스레드 객체가 생성됩니다.

2. 준비 상태(Runnable): 스레드 객체가 생성된 후 다른 스레드가 해당 객체의 start() 메서드를 호출합니다. 이 상태의 스레드는 실행 가능 스레드 풀에 위치하여 실행 가능 상태가 되어 CPU 사용 권한을 얻기를 기다리고 있습니다.

3. 실행 상태(Running): 준비 상태의 스레드가 CPU를 획득하고 프로그램 코드를 실행합니다.

4. 차단된 상태(Blocked): 차단된 상태는 스레드가 어떤 이유로 CPU 사용 권한을 포기하고 일시적으로 실행을 중지하는 것을 의미합니다. 스레드가 준비 상태에 들어갈 때까지 실행 상태로 이동할 기회가 있습니다. 세 가지 차단 상황이 있습니다.

(1) 차단 대기: 실행 중인 스레드가 wait() 메서드를 실행하고 JVM이 해당 스레드를 대기 풀에 넣습니다.

(2) 동기화 차단: 실행 중인 스레드가 객체의 동기화 잠금을 획득할 때 다른 스레드가 동기화 잠금을 점유하고 있으면 JVM은 해당 스레드를 잠금 풀에 넣습니다.

(3) 기타 차단: 실행 중인 스레드가 sleep() 또는 Join() 메서드를 실행하거나 I/O 요청을 발행하면 JVM은 스레드를 차단 상태로 전환합니다. sleep() 상태가 시간 초과되거나, Join()이 스레드가 종료될 때까지 기다리거나 시간 초과되거나, I/O 처리가 완료되면 스레드는 준비 상태로 다시 들어갑니다.

5. 데드 상태(Dead): 스레드가 예외로 인해 실행을 완료했거나 run() 메서드를 종료했으며 스레드의 수명 주기가 종료되었습니다.

Java 예제 - 스레드 상태 가져오기

다음 예에서는 스레드 상태를 가져오는 방법을 보여줍니다.

/*
 author by w3cschool.cc
 Main.java
 */class MyThread extends Thread{
   boolean waiting= true;
   boolean ready= false;
   MyThread() {
   }
   public void run() {
      String thrdName = Thread.currentThread().getName();
      System.out.println(thrdName + " 启动");
      while(waiting)
      System.out.println("等待:"+waiting);
      System.out.println("等待...");
      startWait();
      try {
         Thread.sleep(1000);
      }
      catch(Exception exc) {
         System.out.println(thrdName + " 中断。");
      }
      System.out.println(thrdName + " 结束。");
   }
   synchronized void startWait() {
      try {
         while(!ready) wait();
      }
      catch(InterruptedException exc) {
         System.out.println("wait() 中断。");
      }
   }
   synchronized void notice() {
      ready = true;
      notify();
   }}public class Main {
   public static void main(String args[]) 
   throws Exception{
      MyThread thrd = new MyThread();
      thrd.setName("MyThread #1");
      showThreadStatus(thrd);
      thrd.start();
      Thread.sleep(50);
      showThreadStatus(thrd);
      thrd.waiting = false;
      Thread.sleep(50);
      showThreadStatus(thrd);
      thrd.notice();
      Thread.sleep(50);
      showThreadStatus(thrd);
      while(thrd.isAlive())
      System.out.println("alive");
      showThreadStatus(thrd);
   }
   static void showThreadStatus(Thread thrd) {
      System.out.println(thrd.getName()+" 存活:" +thrd.isAlive()+" 状态:" + thrd.getState() );
   }}

위 코드를 실행한 결과는 다음과 같습니다.

……alive
alive
aliveMyThread #1 结束。alive
alive
alive
alive
alive
alive
aliveMyThread #1 存活:false 状态:TERMINATED

위 내용은 Java 예시입니다. - 스레드 상태 내용 가져오기 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.