如何在 Java 中停止 currentThread? [复制]
Posted
技术标签:
【中文标题】如何在 Java 中停止 currentThread? [复制]【英文标题】:How to stop currentThread in Java? [duplicate] 【发布时间】:2021-06-16 21:18:08 【问题描述】:我正在使用 TestNg 运行并行测试,我想在我的脚本中的某些点停止/终止一个线程。这个脚本有很多层,所以简单地将异常一直抛出到 main() 并不是我的最佳途径。
thread.stop()
为我工作,但它已被弃用,所以我宁愿不使用它,并且 thread.interrupt() 对我不起作用,因为如果线程被中断,我将不得不检查很多不同的地方。这是我的意思的一个简短的虚构示例:
driverexec.navigateTo("http://www.google.com");
xpath= "//input[@name='q111']";
driverexec.typeByXpath("type search", xpath, "gorillas");
System.out.println("gojng again");
xpath= "//input[@name='btnK']";
driverexec.clickByXpath("search google", xpath);
现在,每个driverexec
函数可能失败,我为此设置了失败函数。所以基本上每次我的failure()
函数被调用时,我都想stop
当前线程。
如果中断会导致我不得不放置行的所有示例:
if (thread.interrupted())
在每次函数调用之后或在我的失败函数内部。但即使我把它放在我的失败函数中,这也只是设置了标志。我怎样才能真正停止它?
【问题讨论】:
听起来你想使用异常。这几乎就是异常的目的。你扔掉它,它会冒泡回到你处理它的地方。你甚至不必不断地重新扔它,只是不要处理它。 您无法停止线程。停止线程是一个协作过程,您可以使用中断标志请求停止线程。因此,在线程中运行的代码应该检查标志并处理 InterruptedException。 Java std 支持所有阻塞操作,如 ServerSocket.assept、Socket 读/写、BlokingQueue.put/take、Thread.sleep/wait 等。而且,如果您有自己的代码可以长时间(毫秒,秒...)计算某些东西,则必须将 if (thread.interrupted()) ( throw new InterruptedException(); 放入其中以使代码可中断 但是看起来你不需要在中间中断一些长时间运行的方法,你需要检查一些结果并停止场景。在这种情况下,只需按照 Lino 的建议抛出适当的异常即可。 【参考方案1】:您可以从内部杀死线程,这意味着抛出一个您永远无法捕获的Exception
或Error
,它只会向上传播到调用堆栈:
public void failure()
// as you're using a test, an assertion error may be a suitable option
throw new AssertionError("Test failure");
您也不必担心您的main
方法会受此影响,因为Thread
s 以外的main
-Thread
的异常不会一直向上传播。
【讨论】:
以上是关于如何在 Java 中停止 currentThread? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Java 中使用 nodeJs 停止 Appium 服务器