2013-03-17 222 views
5

我是新來的併發和線程 - 並且在工作中開發我的應用程序時一直使用它們。本質上,我有一些線程在我的RMI應用程序(服務器端組件)中輪詢文件中的更改(這些文件每隔幾秒更新一次)。守護線程Java

在開發箱上進行測試時,我一直在從命令行運行服務器,然後在完成時手動關閉它,然後沖洗並重復全天。

當它發生 - 我想我的線程可能不會停止當我關閉命令行,仍然進行處理。這導致了一些非常不好的副作用 - 儘管我不能100%確定這是否可能,所以希望有人能證實這可能是這種情況。

如果我讓一個線程成爲守護進程 - 這是否意味着當我關閉命令行 - 這些線程會自動停止?我需要很好地終止應用程序,但因爲服務器最終將被autosys運行我不知道什麼最好的方法,使在關機

感謝

+0

這個問題有一個略有不同的傾向,也有另一個問題在身體內 - 我真的很感激它,如果它沒有關閉 – Biscuit128 2013-03-17 17:28:41

+0

你的主要問題出現在缺乏什麼「守護進程」意味着Java的理解,因此到重複問題的鏈接。至於你的其他問題(我認爲這是關於安全關閉你的應用程序的問題),它應該單獨提出,因爲這是一個單獨的問題。 – Jeffrey 2013-03-17 17:34:43

回答

1

下面的代碼演示創建的所有線程完成的一些方法線程池與虛擬運行任務,然後啓動該任務,當應用程序終止時,會運行一個關閉鉤子,取消所有正在運行的任務並乾淨地關閉線程池。

您不必像我一樣使用Callable's,您可以使用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

感謝您的意見,這是否意味着我將不得不使用servlet上下文監聽器反對關閉掛鉤?這是多少相同類型的東西? – Biscuit128 2013-03-17 17:48:08

+0

在獨立Java應用程序中,您可以在使用ContextListener的Java Web應用程序中使用關閉掛鉤。取決於您是否正在清理客戶端或服務器上的線程。 – JayTee 2013-03-17 17:51:12

+0

是的,所有線程都需要停止。 – Biscuit128 2013-03-17 17:53:35

1

在Java虛擬機中運行的線程。如果停止JVM,則線程不再運行。你可以看到退出JVM,因爲拔下了電腦的插頭:沒有任何東西可以運行了。

0

RMI運行時會創建無法停止的線程。關閉服務的唯一方法是使用System.exit()。

我在一個單獨的線程中執行此操作。 After:New ShutThread()。start()之後,關閉線程等待2秒鐘,讓任何留下的消息有機會完成旅程,然後發出System.exit()。

+0

所以對於從命令行啓動的服務器 - 沒有使用java -jar server.jar的參數 - 一旦運行,我們如何向它傳遞一條消息,告訴它正常退出? – Biscuit128 2013-03-17 17:42:29

+0

好點。我編寫服務器軟件,因此包括關閉方法是標準做法。如果其他人不允許這個功能,那麼也許他們應該。 – edharned 2013-03-19 13:44:10