>  기사  >  Java  >  Java의 데몬 스레드와 데몬이 아닌 스레드의 분석 예

Java의 데몬 스레드와 데몬이 아닌 스레드의 분석 예

黄舟
黄舟원래의
2017-10-14 09:37:111196검색

이 글은 주로 Java의 데몬 스레드와 비데몬 스레드에 대한 간략한 논의를 소개합니다. 편집자는 그것이 꽤 좋다고 생각하므로 이제 공유하고 참고용으로 제공하겠습니다. 편집기를 따라 살펴보겠습니다

최근 Java에 대한 기본 지식을 다시 연구한 결과 과거에는 너무 많은 지식이 약간 무시되었다는 것을 발견했습니다. Java의 스레드 메커니즘을 비교하면 Java에는 두 가지 유형의 스레드가 있습니다. 사용자 스레드(사용자) 스레드), 데몬 스레드(데몬 스레드), (PS: 이전에는 무시됨).

유닉스 개발을 공부했지만 자바를 자세히 공부하지 않은 학생들은 혼란스러울 것으로 추정된다. 운영체제에는 데몬 스레드라는 개념이 없고 데몬 프로세스만 있을 뿐 자바 언어 메커니즘은 JVM은 Java 플랫폼이 운영 체제의 최하위 계층을 보호하므로 자체 가상 플랫폼에서 자체적으로 유익한 메커니즘을 구성할 수 있으며 언어 또는 플랫폼 설계자는 Unix에서 어느 정도 영감을 얻었음을 의미합니다. Impact, 데몬 스레드 메커니즘은 JVM과 같은 플랫폼에 적합하므로 데몬 스레드가 탄생했습니다.

데몬의 역할은 GC 스레드와 같은 다른 스레드의 실행을 위한 서비스를 제공하는 것입니다. 실제로 사용자 스레드 스레드와 데몬 스레드 데몬 스레드 간에는 본질적으로 차이가 없습니다. 유일한 차이점은 가상 머신의 출발입니다. 모든 사용자 스레드가 제거되면 데몬 스레드에는 서비스할 스레드가 없으므로 가상 머신은 또한 종료됩니다.

데몬 스레드는 가상 머신 내부에서 제공되지 않습니다. 사용자가 직접 데몬 스레드를 설정할 수도 있습니다. 방법은 다음과 같습니다: public final void setDaemon(boolean on) 그러나 주의할 점이 있습니다:

1) thread.setDaemon(true) thread.start() 전에 설정해야 합니다. 그렇지 않으면 IllegalThreadStateException이 발생합니다. 실행 중인 일반 스레드를 데몬 스레드로 설정할 수 없습니다. (참고: 이는 데몬 프로세스와 분명히 다릅니다. 데몬 프로세스가 생성된 후 프로세스가 원래 세션의 제어권을 제거하고 프로세스가 원래 프로세스 그룹의 제어권을 제거하고 프로세스가 원래 제어 터미널의 제어를 제거하여 가상에 배치합니다. 기계의 언어 메커니즘은 본질적으로 시스템 수준 언어와 다릅니다.

2) 데몬 스레드에서 생성된 새 스레드도 데몬의 것입니다. (이것은 본질적인 차이점입니다. 데몬 프로세스인 fork()에서 나오는 하위 프로세스는 더 이상 데몬 프로세스가 아닙니다. 상위 프로세스의 프로세스 관련 정보를 복사하지만 하위 프로세스의 상위 프로세스는 하위 프로세스가 아닙니다. init 프로세스. 소위 데몬 프로세스는 본질적으로 "상위 프로세스가 종료되고 init가 이를 채택한 다음 파일 0, 1, 2는 모두 /dev/null이고 현재 디렉터리는 /입니다."를 의미합니다.

3) 읽기 및 쓰기 작업이나 계산 논리와 같은 서비스를 수행하기 위해 모든 애플리케이션에 데몬 스레드를 할당할 수 있는 것은 아닙니다. 데몬 스레드가 작업을 수행하기 전에 가상 머신이 종료되었을 수 있기 때문입니다.

예:


//完成文件输出的守护线程任务

import java.io.*; 

 

class TestRunnable implements Runnable{ 

  public void run(){ 

        try{ 

         Thread.sleep(1000);//守护线程阻塞1秒后运行 

         File f=new File("daemon.txt"); 

         FileOutputStream os=new FileOutputStream(f,true); 

         os.write("daemon".getBytes()); 

      } 

        catch(IOException e1){ 

     e1.printStackTrace(); 

        } 

        catch(InterruptedException e2){ 

         e2.printStackTrace(); 

      } 

  } 

} 

public class TestDemo2{ 

  public static void main(String[] args) throws InterruptedException 

  { 

    Runnable tr=new TestRunnable(); 

    Thread thread=new Thread(tr); 

        thread.setDaemon(true); //设置守护线程 

    thread.start(); //开始执行分进程 

  } 

}

실행 결과: daemon.txt 파일에 "daemon" 문자열이 없습니다.

하지만 thread.setDaemon(true); //데몬 스레드를 설정하면 daemon.txt 파일을 데몬 문자열에 쓸 수 있습니다

JRE에서 프로그램이 종료되었는지 판단하는 표준은 다음과 같습니다. 모든 프런트 데스크는 백그라운드 스레드의 상태와 관계없이 실행 스레드가 완료되므로 백그라운드 스레드를 사용할 때 이 문제에 주의해야 합니다.

그런데 데몬 스레드의 실제 적용은 어디에 있나요? 예를 들어 웹 서버의 서블릿의 경우 컨테이너가 시작되면 서비스 스레드, 즉 예약 스레드가 백그라운드에서 초기화되어 http 요청 처리를 담당합니다. 그런 다음 예약 스레드는 각 요청에 대해 다음 작업을 수행합니다. 요청을 처리하기 위해 스레드 풀에서 작업자 스레드를 꺼내 동시성 제어 목적을 달성합니다.

이해를 돕기 위해 인터넷에서 가져온 사진:

위 내용은 Java의 데몬 스레드와 데몬이 아닌 스레드의 분석 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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