如何在 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】:

您可以从内部杀死线程,这意味着抛出一个您永远无法捕获的ExceptionError,它只会向上传播到调用堆栈:

public void failure() 
    // as you're using a test, an assertion error may be a suitable option
    throw new AssertionError("Test failure");

您也不必担心您的main 方法会受此影响,因为Threads 以​​外的main-Thread 的异常不会一直向上传播。

【讨论】:

以上是关于如何在 Java 中停止 currentThread? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中停止程序的运行? [复制]

如何在 Java 中使用 nodeJs 停止 Appium 服务器

如何在 Java 中停止 currentThread? [复制]

如何在 java.awt.graphics 中停止闪烁?

如何等到计时器在java中停止?

如何在 IntelliJ 中停止通配符 Java 包导入