2014-02-12 37 views
0

我有一个线程池有5个线程,并有他们未来的句柄存储在一个ArrayList。我想要做的是在所有线程退出后返回主线程。我的情况是创建一个无限运行的程序。我的概念很简单,但我不知道如何实现它。线程池关闭后返回主线程?

  1. main()方法调用threadManager()方法
  2. threadManager()创建线程
  3. 有些线程抛出一个异常和问题futureCancel()方法,所有线程发出future.cancel,然后关闭线程池
  4. 程序返回到主方法,该方法再次调用threadManager()并继续。
+0

您可以重命名'futureCancel'(类似于'restartThreads'),并在其末尾调用'threadManager'吗? (如果错误处理线程不是一个运行它的好地方,你可能会启动一个新线程来运行'threadManager'。)在我听起来像是在一天结束的时候,你想关闭所有的东西这个错误,并开始备份。 'main'不是特别的;你可以在任何线程的任何方法中做到这一点。一个注意:我会确保一些关闭应用程序的干净方式存在。 – jpmc26

+0

你明白了我的观点,在一个错误结束时,我将关闭一切并重新启动它。我想我可以让futureCancel(restarThread)成为旧池关闭的新线程,关闭老池并重新启动一个新池。 –

+0

我有一个关机挂钩,用于任何灾难性事件,在不正确关机之前清理所有网络连接。 –

回答

0

这是你想要做的吗?

// Always has 5 threads even if 1 throws an exception 
ExecutorService exe = Executors.newFixedThreadPool(5); 

List<T> results = new ArrayList<T>(); 
while(results.isEmpty()) { 
    List<Callable<T>> tasks = createTasks(); 
    List<Future<T>> futures = exe.invokeAll(tasks); 

    for(Future<T> future : futures) { 
     try{ 
      results.add(future.get()); // throws InterruptedException, ExecutionException 
     } catch(Exception e) { 
      results.clear(); 
      break; 
     } 
    } 
} 
+0

类似的东西。但我不保存结果。所以我正在使用一个外部库,它可以帮助检测我的线程创建的连接的超时时间。一旦我在一个连接上遇到超时,我就去发布“future.cancel”。有没有办法可以在该方法之后返回到主线程?添加一个while(true)循环是一个选项,但是我想要其他的东西在动作或类似的东西上保持阻塞状态。 –

+0

我不明白你的“返回”主线程的概念。主线程永远不会停止运行。线程不会“走到”和“从彼此回来”。他们被创造,他们运行,有时他们停止。他们不会互相“拜访”。 – Stewart