java 라인의 생명주기 사용

생로병사와 마찬가지로 라인도 시작(대기), 운행, 끊기, 정지 등 네 가지 다른 상태를 겪어야 한다.이 네 가지 상태는 모두 Thread 클래스의 방법을 통해 제어할 수 있다.다음은 Thread 클래스와 이 네 가지 상태와 관련된 방법을 설명합니다..

//
     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;
1, 라인 생성 및 실행
루틴은 구축된 후 run 방법의 코드를 바로 실행하지 않고 대기 상태입니다.스레드가 대기 상태일 때, 스레드의 우선 순위 (setPriority), 스레드 이름 (setName), 스레드의 형식 (setDaemon) 등 스레드의 다양한 속성을 Thread 클래스를 통해 설정할 수 있습니다.
start 방법을 호출한 후, 루틴은run 방법의 코드를 실행하기 시작합니다.라인이 운행 상태에 들어갔다.스레드 클래스의 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 !
isAlive: false
2, 끊기와 깨우기 스레드
루틴이 실행되기 시작하면 루틴이 실행될 때까지 루틴이 종료됩니다.그러나 스레드가 실행되는 과정에서 두 가지 방법을 통해 스레드가 일시적으로 실행을 멈추게 할 수 있다.이 두 가지 방법은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를 사용할 때 한 라인에서 다른 라인을 휴면해서는 안 된다는 것을 주의해야 한다.메인 방법에서thread를 사용합니다.sleep(2000) 방법은thread 라인을 2초 동안 휴면시킬 수 없고, 주 라인을 2초만 휴면시킬 수 있습니다.
sleep 방법을 사용할 때 주의해야 할 두 가지가 있습니다.
    1. sleep 방법은 두 가지 재부팅 형식이 있는데 그 중 하나는 밀리초를 설정할 수 있을 뿐만 아니라 나노초(1000000나노초는 1밀리초)도 설정할 수 있다.그러나 대부분의 운영체제 플랫폼의 자바 가상 머신은 나초까지 정확하게 할 수 없기 때문에 sleep에 나초를 설정하면 자바 가상 머신은 이 값에 가장 가까운 밀리초를 얻게 된다.
    2. sleep 방법을 사용할 때throws나try {...}catch {...}를 사용해야 합니다.run 방법은throws를 사용할 수 없기 때문에try {...}catch {...}만 사용할 수 있습니다.스레드가 휴면하는 과정에서,interrupt 방법 (이 방법은 2.3.3에서 논의됩니다) 을 사용하여 스레드를 중단할 때sleep는 Interrupted Exception 이상을 던집니다.sleep 방법의 정의는 다음과 같다

1 public static void sleep(long millis)  throws InterruptedException
2 public static void sleep(long millis,  int nanos)  throws InterruptedException
3. 라인을 중지하는 세 가지 방법
중지 라인을 만들 수 있는 세 가지 방법이 있다.
    1.종료 표시를 사용하여 루틴을 정상적으로 종료합니다. 즉run 방법이 완성된 후에 루틴이 종료됩니다.
    2.stop 방법을 사용하여 라인을 강제로 종료합니다. (이 방법은 사용을 추천하지 않습니다. stop은suspend,resume와 마찬가지로 예측할 수 없는 결과가 발생할 수 있기 때문입니다.)
    3.인터럽트 방법으로 라인을 중단합니다.
    1. 종료 플래그를 사용하여 스레드 종료
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의 값을 수정할 수 있습니다.
    2. stop 방법으로 라인을 종료합니다
stop 방법을 사용하면 실행 중이거나 끊긴 라인을 강제로 종료할 수 있습니다.우리는 다음과 같은 코드를 사용하여 라인을 종료할 수 있다

1 thread.stop();
위의 코드를 사용하면 라인을 종료할 수 있지만 stop 방법을 사용하는 것은 매우 위험하다. 정상적인 프로그램에 따라 전원을 끄지 않고 컴퓨터 전원을 갑자기 끄는 것과 같이 예측할 수 없는 결과가 발생할 수 있기 때문에 stop 방법으로 라인을 종료하는 것을 추천하지 않는다.
    3. 인터럽트 방법으로 라인을 종료합니다
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
  !

인터럽트 방법을 호출한 후sleep 방법은 이상을 던지고 오류 정보를 출력합니다:sleep 인터럽트.
주의:Thread 클래스 중 두 가지 방법으로 라인이interrupt 방법을 통해 종료되었는지 판단할 수 있습니다.하나는 정적 방법인interrupted (), 하나는 비정적 방법인isInterrupted () 이다. 이 두 가지 방법의 차이는interrupted는 현재 선이 중단되었는지 판단하는 데 사용되고, isInterrupted는 다른 라인이 중단되었는지 판단하는 데 사용된다.따라서,while (!isInterrupted ()) 도while (!Thread.interrupted () 로 바꿀 수 있습니다.

좋은 웹페이지 즐겨찾기