2013-03-17 260 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