java 라인의 생명주기 사용
//
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 () 로 바꿀 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.