Java 종료 스레드 인스턴스 및 stop() 메소드 읽기

5444 단어 java라인중지stop
스레드 이해
개념
루틴은 프로그램의 실행 루틴입니다.Java 가상 머신을 사용하면 여러 실행 루틴을 동시에 실행할 수 있습니다.
스레드 특징
상태를 가지면 스레드의 상태를 나타내고 같은 시간에 JVM의 어떤 스레드는 하나의 상태만 나타낸다.
・NEW
아직 시작되지 않은 스레드 (프로그램 실행 시작부터 지금까지 시작되지 않은 스레드)
・RUNNABLE
실행 가능한 스레드, JVM에서 실행 중이지만 CPU와 같은 다른 리소스를 기다리고 있을 수 있습니다.
・BLOCKED
어떤 자물쇠가 계속 실행될 수 있도록 기다리는 막힌 스레드
・WAITING
무한 대기 (다시 실행하는 것은 이 상태로 들어가는 라인에 의존하여 특정한 작업을 수행하는 것)
・TIMED_WAITING
정시 대기 (다시 실행하는 것은 이 상태로 들어가는 라인에 의존하여 지정된 대기 시간 내에 특정한 조작에 의존함)
・TERMINATED
종료된 스레드
우선순위를 가지고 라인의 실행 순서를 결정한다.
1에서 10 사이의 정수, 기본 값은 5입니다.수치가 높을수록 실행 확률이 높고 우선순위가 라인의 실행 순서를 결정할 수 없습니다.
하위 스레드의 우선 순위는 기본적으로 부모 스레드와 같습니다.
다음 상황이 발생하면 JVM은 모든 스레드 실행을 중지합니다.
Runtime (실행 시) 의 exit () 방법이 호출되고 이 방법의 호출은 Security Manager에서 허용됩니다.
모든'비수호 스레드'가 실행을 중지했습니다 (정상적으로 멈추든 한바탕 멈추든).
데몬(Daemon)으로 표시 가능
수호 라인의 하위 라인은 여전히 수호 라인이다.
수호 루트는 바로'백그라운드 루트'로 백그라운드 작업을 수행하는 데 사용되고 사용자 루트는 일반 사용자가 사용자 수준의 작업을 수행합니다.
라인을 종료하는 방법
1. 종료 표시를 사용하여 라인을 정상적으로 종료합니다. 즉, run 방법이 완성된 후에 라인이 종료됩니다.
run 방법이 실행되면 라인이 종료됩니다.하지만 때로는 런 방법은 영원히 끝나지 않을 때가 있다.서비스 사이드 프로그램에서 클라이언트 요청을 감청하거나 순환 처리해야 하는 다른 작업을 라인을 사용합니다.이런 상황에서 일반적으로 이 임무들을 하나의 순환에 놓는다. 예를 들어while 순환이다.순환을 영원히 실행하려면while (true) {...} 을 사용하여 처리할 수 있습니다.그러나while 순환을 특정한 조건에서 종료시키려면 가장 직접적인 방법은boolean 형식의 로고를 설정하고 이 로고를true 또는false로 설정하여while 순환이 종료되는지 여부를 제어하는 것이다.다음은 퇴출 로고를 이용하여 라인을 종료하는 예를 제시했다.
FlagExitThread.java

package com.rainmonth;
/**
* Created by RandyZhang on 2017/3/23.
*/
public class FlagExitThread extends Thread {
	public volatile Boolean isExit = false;
	public FlagExitThread(String name) {
		super(name);
	}
	@Override
	  public void run() {
		while (!isExit) {
			System.out.println("I'm running");
		}
	}
}
DemoClient.java

package com.rainmonth;
/**
* Created by RandyZhang on 2017/3/23.
*/
public class DemoClient {
	public static void main(String[] args) {
		System.out.println(" ");
		exitByFlag();
		// exitByInterrupt();
	}
	private static void exitByFlag() {
		FlagExitThread flagExitThread = new FlagExitThread(FlagExitThread.class.getSimpleName());
		flagExitThread.start();
		try {
			Thread.sleep(1000);
			flagExitThread.isExit = true;
			flagExitThread.join();
			System.out.println(" ");
		}
		catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	private static void exitByInterrupt() {
		FlagExitThread flagExitThread = new FlagExitThread(FlagExitThread.class.getSimpleName());
		System.out.println("flagExitThread running...");
		flagExitThread.start();
		try {
			Thread.sleep(1500);
			System.out.println("flagExitThread interrupted...");
			flagExitThread.interrupt();
			Thread.sleep(1500);
			System.out.println("stop application...");
		}
		catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
출력 결과:
많은 I'm 런닝을 인쇄한 후 라인이 종료됩니다.
2. stop 방법으로 라인을 강제로 종료합니다. (이 방법은 사용을 추천하지 않습니다. stop은suspend,resume와 마찬가지로 예측할 수 없는 결과가 발생할 수 있기 때문입니다.)
stop () 호출 방법을 표시합니다.소스 코드에서 stop () 에 대한 설명은 다음과 같습니다.

/*
* This method is inherently unsafe. Stopping a thread with
* Thread.stop causes it to unlock all of the monitors that it
* has locked (as a natural consequence of the unchecked
* <code>ThreadDeath</code> exception propagating up the stack). If
* any of the objects previously protected by these monitors were in
* an inconsistent state, the damaged objects become visible to
* other threads, potentially resulting in arbitrary behavior. Many
* uses of <code>stop</code> should be replaced by code that simply
* modifies some variable to indicate that the target thread should
* stop running. The target thread should check this variable
* regularly, and return from its run method in an orderly fashion
* if the variable indicates that it is to stop running. If the
* target thread waits for long periods (on a condition variable,
* for example), the <code>interrupt</code> method should be used to
* interrupt the wait.
*/
이 방법의 불안정성은 고유하다는 뜻이다.stop () 를 호출하여 하나의 라인을 종료하면 잠긴 모든 모니터를 방출합니다. (이것은 창고를 따라 검사로 전파되는Thread Death가 이상하게 던져질 수 있습니다.) 이 때 이전에 방출된 모니터로부터 보호된 대상에 불일치성이 존재하고 다른 라인을 볼 수 있으면 예상치 못한 결과를 초래할 수 있습니다.stop 작업은 일부 코드만 수정하면 목표 라인이 실행을 멈춰야 하는 코드를 표시해서 대체할 수 있는 것이 있어야 한다. (방법은 바로 이런 방식이다.)만약 목표 루틴이 어떤 조건 (예를 들어 어떤 조건 변수) 을 기다리기 때문에 오랫동안 기다린다면, 우리는 인터럽트 방법을 사용하여 이 기다림을 중단해야 한다.
3. 인터럽트 방법으로 라인을 중단합니다.
interrupt는 글자상으로는 종료라는 뜻이지만, interrupt를 호출해서 라인을 종료하려고 하지 마십시오. 때로는 이 방법을 호출해도 라인은 계속 실행됩니다. 위의 exitByFlag () 를 주석하고 exitByInterrupt () 방법을 켜면 interrupt () 방법을 사용하고 I'm running을 계속 출력할 수 있습니다. (시스템과 CPU 결과가 다를 수 있습니다.)인터럽트 방식을 사용하는 것도 안전하지 않다는 것을 알 수 있다.
총결산
이상의 분석에 의하면 가장 추천할 만한 방법은 첫 번째이다. 우리는 공유 변수(shared variable) 방식으로 표지를 설정하고 신호를 보내며 라인이 종료되어야 한다고 통지할 수 있다.물론 이 공유 변수의 조작에 대해 우리는 반드시 동기화를 보장해야 한다.
이상은 본고에서 자바 종료 루틴 실례와 stop() 방법의 원본 읽기에 관한 모든 내용입니다. 여러분께 도움이 되기를 바랍니다.관심 있는 친구는 본 사이트의 다른 관련 주제를 계속 참고할 수 있습니다. 부족한 점이 있으면 댓글로 지적해 주십시오.여러분의 본 사이트에 대한 지지에 감사 드립니다!

좋은 웹페이지 즐겨찾기