2014-02-17 66 views
0

有3个线程:主线程(main()运行的线程),Thread AThread B有一个线程启动另一个线程,然后死

操作顺序:

  • 程序启动(主())
  • 主线程中实例化并开始Thread A
  • Thread A X秒后实例化Thread B
  • Thread B已启动。
  • Thread B X秒后实例化Thread A
  • Thread A开始。

如果调用Thread B是可运行的Thread A执行的最后一条语句,将Thread AThread B终止后,被实例化并开始了吗?或者将Thread B嵌套在Thread A中,因此创建无限数量的嵌套线程?什么是默认行为,我将如何完成NOT创建无限数量的线程(我希望每个以前的线程在孩子生存时结束)。

A Thread.join()会导致线程等待,直到子线程死亡,是否正确?

如果这一般只是不好的做法,任何人都可以推荐替代品,基本上可以完成同样的任务吗?我需要一个函数,几秒钟后,调用另一个函数,然后与第一个函数同时运行。第一个函数在完成一些命令后会死掉。第二个函数应该在几秒钟后调用第一个函数的新实例。此循环应继续,直到主线程中止(或直到​​程序退出)。

+1

如果你不想保持instanciating和销毁一堆线程,你可以随时查看工作线程池。这个想法是,线程呆在周围,给他们工作单位,然后等待更多的工作。好处是你不会浪费时间在不断的杀死和产生线程的开销上。 – zero298

回答

2

你的问题包含答案:你正在考虑线程作为任务或“运行的功能”,他们不是。线程执行任务,因此围绕可创建其他任务的任务的想法设计代码。任务只是实现Runnable接口的对象,仅此而已。您可以使用所需的所有数据构建这些任务(或可运行对象),甚至包括对其他(父级)任务的引用。
创建一个CachedThreadPool并且每当任务准备好执行时,使用execute方法转储线程池中的任务。

您需要考虑的一件事是程序关闭:您需要关闭ThreadPool才能正常关闭程序。您可以简单地致电shutdownNow,但您可能需要设置一项技术,使重要任务有机会完成然后关闭。这需要一些练习才能正确(例如shutdownHooks并不容易),但从此以后,只要您需要多个线程,就可以重新使用它。

相关问题