2013-03-17 3 views
5

나는 동시성과 스레드에 익숙하지 않으며, 직장에서 응용 프로그램을 개발할 때이를 사용하고 있습니다. 본질적으로 나는 (몇 초마다 이러한 파일을 업데이 트) 파일의 변경 사항을 폴링 내 RMI 응용 프로그램 (서버 쪽 구성 요소)의 스레드가 있습니다.데몬 스레드 Java

dev 상자에서 테스트 할 때 명령 줄에서 서버를 실행 한 다음 작업이 끝나면 수동으로 닫고 하루 종일 반복합니다.

- 내가 명령 줄을 닫고 처리를 계속할 때 내 스레드가 멈추지 않을 수도 있습니다. 이것은 아주 나쁜 부작용을 초래합니다. 가능하다면 100 % 확신 할 수는 없지만 누군가가 이것이 사실 일 수 있음을 확인할 수 있기를 바랍니다.

내가 스레드를 데몬으로 만들면 명령 행을 종료 할 때 이러한 스레드가 자동으로 중지된다는 의미입니까? 나는 잘 응용 프로그램을 종료하지만 서버는 결국 autosys에 의해 운영되기 때문에 내가 가장 좋은 방법은

감사

+0

이 질문은 약간 다른 기울기가 있고 몸 안쪽에 또 다른 질문이 있습니다. 닫히지 않았다면 정말 감사하겠습니다. – Biscuit128

+0

주 질문은 "데몬"이 Java에 어떤 의미인지 이해하지 못함에 따라 발생합니다. 중복 질문에 대한 링크. 귀하의 다른 질문 (귀하의 신청서를 안전하게 종료하는 것으로 가정)에 대해서는 별도의 질문이므로 별도로 질문해야합니다. – Jeffrey

답변

1

다음 코드는을 만드는 보여를 종료 할 때 모든 스레드가 완료 만들 무슨 모르겠습니다의 방법이 필요 스레드 풀을 실행중인 더미 스레드와 함께 실행하면 해당 작업이 시작되고 응용 프로그램이 종료되면 종료 훅이 실행되어 실행중인 모든 작업을 취소하고 스레드 풀을 완전히 닫습니다.

당신은 Callable을 가지고 있지 않아도 Runnables와 threadPool.execute 메소드를 사용할 수 있으며 좀 덜 우아한 threadPool을 종료 할 수 있습니다.

final ExecutorService threadPool = Executors.newCachedThreadPool(); 
    final List<Future<Void>> runningTasks = new ArrayList<>(); 
    Future<Void> task = threadPool.submit(new Callable<Void>() { 

     @Override 
     public Void call() throws Exception { 
      int count = 0; 
      while(true) { 
       System.out.println(++count); 
       Thread.sleep(1000); 
      } 
     } 
    }); 
    runningTasks.add(task); 

    Runtime.getRuntime().addShutdownHook(new Thread() { 
     @Override 
     public void run() { 
      for(Future<Void> runningTask : runningTasks) { 
       runningTask.cancel(true); 
      } 
      threadPool.shutdownNow(); 
     } 
    }); 

종료 훅은 독립 실행 형 응용 프로그램을위한 것입니다. Java EE 컨테이너에서 javax.servlet.ServletContextListener와 동일한 작업을 수행 할 수 있습니다.

+0

조언을 주셔서 감사합니다, 이것은 내가 종료 훅에 반대 서블릿 컨텍스트 리스너를 사용해야한다는 뜻입니까? 이것도 같은 유형의 것입니까? – Biscuit128

+0

독립 실행 형 Java 응용 프로그램에서 ContextListener를 사용하는 Java 웹 응용 프로그램에서 종료 훅을 사용할 수 있습니다. 클라이언트 또는 서버에서 스레드를 정리할 경우에 따라 다릅니다. – JayTee

+0

예 모든 스레드를 중지해야합니다. – Biscuit128

1

Java 가상 머신 내에서 실행되는 스레드. JVM을 중지하면 스레드가 더 이상 실행되지 않습니다. JVM을 종료하면 컴퓨터에서 플러그가 빠져 나가는 것을 볼 수 있습니다. 아무 것도 실행할 수 없습니다.

0

RMI 런타임은 중지 할 수없는 스레드를 만듭니다. 서비스를 종료하는 유일한 방법은 System.exit()입니다.

별도의 스레드에서이 작업을 수행합니다. After : new ShutThread(). start(), 종료 된 스레드는 느린 메시지에 여정을 완료 할 수있는 기회를주기 위해 2 초 정도 기다린 후 System.exit()을 실행합니다.

+0

그래서 명령 줄에서 시작된 서버의 경우 - java -jar server.jar를 사용하는 인수없이 - 일단 이것이 실행되면 정상적으로 종료되도록 메시지를 전달하는 방법은 무엇입니까? – Biscuit128

+0

좋은 지적. 나는 서버 소프트웨어를 작성하므로 종료 방법은 표준 방법이다. 다른 사람들이이 기능을 허용하지 않는다면 아마도 그렇게해야 할 것입니다. – edharned

관련 문제