有没有一种方法可以暂停Java中主线程的所有线程?

问题描述 投票:0回答:2

基本上就是这样。假设我有一个有 6 个线程的程序(包括主线程)。有没有一种方法可以暂停/睡眠/挂起主线程中的所有其他 5 个线程?可以说,通过获取他们的 ID,然后用它来暂停所有这些人(或通过任何其他方法)。

java multithreading sleep pause suspend
2个回答
2
投票

这将为您提供迄今为止创建的应用程序的所有线程

Set<Thread> threadSet = Thread.getAllStackTraces().keySet();

要停止线程,您必须编写自己的自定义线程类,如本示例中所述,它使用标志来控制线程执行

https://www.baeldung.com/java-thread-stop

在迭代线程集时 threadSet 设置标志的值以使其停止


0
投票

很确定没有办法做到这一点。

接受的答案不应该被接受,这是完全错误的。

首先,即使您可以确保程序中控制的每个线程都按照建议的方式工作(在大多数大型软件部署中不太可能),仍然有一些线程您无法控制(GC 线程、终结器线程、事件调度线程)任何 GUI 工具包,如果您使用 JEE/Spring 等任何类型的容器,则更多)。

其次,它显然不起作用,即使对于您可以控制的线程也是如此。问题是你能否“暂停”线程,而不是停止它们。如果您尝试调整给定的代码以能够暂停并随后恢复,您将会失败。中断方法将中止正在“// do some here”处执行的代码,并且当您尝试恢复时,它正在执行的任何操作都将保持不完整。 可以使用锁将代码修改为“某种”工作,即控制器线程获取锁,并让您控制的所有其他线程

等待获取锁。如果您希望控制器线程本身等待,直到所有受控线程到达“锁定”点,则需要 CountdownLatch。但这仍然不是真正的问题:线程不会被这种机制“主动”暂停;在尝试获取锁之前,他们将继续运行链接示例中“//在此处执行某些操作”处的代码。无论如何,它都是侵入性的。我相当确定提出问题的人不想要一个需要他们完全重新组织所有代码工作方式的解决方案。

我不认为虚拟线程(Java 19 中引入)会改变这一点。在幕后,JVM通过使用延续来暂停和取消暂停虚拟线程https://en.wikipedia.org/w/index.php?title=Continuation&useskin=vector,但我不认为这会暴露给客户端代码,或者至少还没有。

© www.soinside.com 2019 - 2024. All rights reserved.