当前位置: 首页 > 知识库问答 >
问题:

如何中断线程并在Runnable对象中捕获中断

艾子石
2023-03-14

我有两个实现Runnable接口的对象,并在单独的线程中执行它们。本质上,在Runnable对象的run()方法中,我执行一些网络活动,包括调用在等待输入(来自网络)时阻塞的方法。请注意,我没有任何有意的暂停,即thread.sleep()调用。任何暂停都是由对可能阻塞的方法的调用引起的。

这些可运行对象在GUI的控制下,因此GUI界面和我希望提供给用户的一个功能是结束执行我的可运行对象的线程的能力,但是我无法理解如何做到这一点。

digiSearch = new DigiSearch(hostIP,this);
digiSearchThread = new Thread(digiSearch);
digiSearchThread.start();

下面是我的Runnable类,我希望/需要捕获其执行线程的中断。

public class DigiSearch implements Runnable {

private String networkAdapterIP;
private DigiList digiList;

public DigiSearch (String ipAddress, DigiList digiList){
    networkAdapterIP = ipAddress;
    this.digiList = digiList;
}
@Override
public void run() {
    
    try{
        /*
 * Do some network and other activities here which includes calling some blocking methods.  However I would like to interrupt the run() method if possible by calling Thread.interrupt()
*/
                    
            
    }  catch (Exception ex){
       digiList.digiListException(ex);
    } catch (Throwable t){
       System.out.println("Search thread interrupted");
    }
}

}

有人能告诉我如何实现这一点,或者解决我对中断线程的误解吗?

共有1个答案

裴经义
2023-03-14

这里需要注意几点:

1)虽然我同意为用户提供一个停止执行线程的功能是有用的,但我建议考虑线程已经在执行的操作。是否可以回滚该操作?是否可以忽略该操作并停止执行?

2)thread.stop()和thread.destroy()等是不推荐使用的方法(http://docs.oracle.com/javase/6/docs/api/)

public class MyClass implements Runnable {
    private volatile boolean isAlive=true;

   /**
    * Request thread stop by calling requestThreadStop() externally.
    */
    public void requestThreadStop() {
        isAlive = false;
    }

    @Override
    public void run() {
        while(isAlive) {
            //Do All your thread work
            //if isAlive is modified, the next iteration will not happen
        }
    }
}

为了避免重复,您可以从之前的stackoverflow文章如何在Java中停止Executor ThreadPool的执行?

 类似资料:
  • 问题内容: 我们希望在应用程序日志中跟踪这些异常-默认情况下,Java只会将它们输出到控制台。 问题答案: 在EDT中和EDT外,未捕获的异常之间存在区别。 另一个问题有一个解决方案,但是如果您只想咀嚼EDT部分的话…

  • 问题内容: 我正在尝试停止线程,但是我不能这样做: 因此,即使我调用方法“停止”,线程也不会停止。它一直活着。 如何中断/停止该线程? 更新 (@little方法) 中间件类: 但是,当我尝试停止线程时,它没有。 上面的代码有什么问题? 问题答案: 确实没有必要使用标志。相反,只需使用来查询线程的状态。另外,为什么还要将线程对象包装在另一个线程对象中?对我来说,这似乎完全没有必要。 这是你应该做的

  • 问题内容: 我在Python中构建了一个简短的url转换器引擎,并且看到大量的“管道破损”错误,并且很好奇在使用BaseHTTPServer类时如何最好地捕获它。这不是全部代码,但可以让您大致了解我目前正在做什么: 该代码本身运行良好,但是在生产中几乎立即开始引发错误: 这些错误的大部分似乎源于在调用send_header()方法时遇到的问题,其中我要写的是: 所以我很好奇在我的代码中尝试捕获此I

  • 问题内容: 使用return by时,如何中断它? 问题答案: 为此,您需要将任务分配给,而不是调用。当您执行此操作时,将返回一个可用于操纵计划任务的a。特别是,您可以调用关联程序来中断当前正在执行的任务(或者,如果该任务尚未开始运行,则完全跳过执行)。 顺便说一句,由返回的对象实际上是个。

  • 问题内容: 我需要制作一个具有同步和异步功能的库。 -等到得到结果,然后返回结果。 -立即返回Future,如果需要,可以在完成其他操作后进行处理。 我图书馆的核心逻辑 客户将使用我们的库,他们将通过传递构建器对象来调用它。然后,我们将使用该对象构造一个URL,并通过执行该对象来对该URL进行HTTP客户端调用,并在将响应作为JSON字符串返回给我们之后,通过创建对象将该JSON字符串发送回给我们

  • 我有一个Spring Boot应用程序,它是移动/Web应用程序的API。其中一个endpoint接受如下的MultipartFile(图像或视频): 当调用该方法时,我获取文件内容并将其保存在某个地方。但是,我注意到一个错误 - 如果我在上传过程中终止了移动应用程序上的网络连接,我在API端没有得到任何类型的,我最终会得到一个截断的字节数组: 所以问题是:如何确保直播不会中断? 使用Spring