【问题标题】:Have a thread start another thread and then die让一个线程启动另一个线程然后死掉
【发布时间】:2014-02-17 17:24:06
【问题描述】:

有 3 个线程:主线程(运行 main() 的线程)、Thread AThread B

操作顺序:

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

如果对Thread B 的调用是Thread A 的runnable 中执行的最后一条语句,那么Thread A 会在Thread B 被实例化并启动后终止吗?或者Thread B 会嵌套在Thread A 中,从而创建无限数量的嵌套线程?默认行为是什么,我将如何完成不创建无限数量的线程(我希望每个先前的线程在孩子存活时结束)。

Thread.join() 会导致线程等待子线程死亡,对吗?

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

【问题讨论】:

  • 如果您不想继续实例化和销毁一堆线程,您可以随时查看工作线程池。这个想法是线程留在周围并被赋予它们所做的工作单元,然后等待更多的工作。好处是您不会因为不断杀死和生成线程的开销而浪费时间。

标签: java multithreading


【解决方案1】:

您的问题包含答案:您将线程视为任务或“要运行的函数”,但事实并非如此。线程执行任务,因此围绕可以创建其他任务的任务的想法来设计代码。任务只是实现Runnable 接口的对象,仅此而已。您可以使用它们需要的所有数据构建这些任务(或可运行对象),甚至包括对其他(父)任务的引用。
创建一个CachedThreadPool,每当准备好执行任务时,使用execute 方法将任务转储到线程池中。

您需要考虑的一件事是程序关闭:您需要关闭 ThreadPool 才能优雅地关闭您的程序。您可以简单地调用shutdownNow,但您可能需要一种技术,让重要任务有机会完成然后关闭。这需要一些练习才能使其正确(例如shutdownHooks 并不容易),但从那时起,您可以在需要超过 1 个线程时重复使用它。

【讨论】:

    猜你喜欢
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    相关资源
    最近更新 更多