【发布时间】: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 的建议抛出适当的异常即可。
标签: java multithreading testng java-threads