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

干净利落地停止线程

董高洁
2023-03-14

我终于在我的程序中实现了Thread.interrupt()而不是Thread.stop()。然而,我不确定我做得好不好。

我有一个类,它扩展了Thread并声明了几个方法。每个方法都抛出InterruptedException(每个方法都执行I/O密集型操作,其中一些需要几分钟才能完成,因此我没有使用线程安全标志,因为该标志直到操作完成后才会被检查)。我还在这些方法的几个地方添加了以下代码来抛出异常:

if (this.isInterrupted()) throw new InterruptedException();

在run()方法中,我为InterruptedException执行try/catch中的所有方法。如果被捕获,我将执行Process。destroy()和BufferedReader。类变量的close()。

这一切工作,似乎工作得很好,但我有几个问题:

  1. 有10多个方法,都抛出InterruptedException是正确的吗?有没有更好的方法可以做到这一点?
  2. 用检查is中断()来膨胀方法是正确的吗?
  3. 在catch InterruptedException块的末尾,我必须执行“返回”或“空”某些值才能使Thread可用于GC吗?如果我重新创建Thread,初始化所需的时间比平时长。
  4. 最后,是否有与我所做的相关的问题/增强?

提前感谢您的帮助!

共有1个答案

平和雅
2023-03-14

Java中的线程中断并不意味着停止该线程的执行。它不是停止,而是中断。当一些基本和关键的东西发生变化时,线程可能会被中断,告诉线程它的执行上下文、任务或环境以某种重大方式发生了变化。对此消息的线程反应是特定于实现的。它可以是停止,它可以是重新启动或任何其他操作。不处理中断的线程不能被中断,但其行为仍然可以被改变,例如,通过使用共享变量。

例如,假设您有许多线程,所有线程都在问题空间的一部分中搜索解决方案。当一个线程找到解决方案时,它可以中断其他线程,因为它们对解决方案的搜索不再相关。已经找到了解决办法。

或者想象一个持续工作的主线程和一个网络通信线程。每次网络线程收到消息时,它都会用该消息中断工作线程。根据消息和上下文的内容,工作线程可以决定下一步要做什么。例如,如果消息是“STOP”,那么它可以立即停止所有执行。如果消息是“RESET”,它可以从头开始,也可以不从头开始,并根据执行上下文重用以前的一些工作。

有10个以上的方法,所有这些方法都会抛出InterruptedException,这对吗?有更好的方法吗?

不,这完全没问题,只要你知道你在做什么。如果实现中断以仅停止线程,则无需引发中断异常。Thread 的 run() 方法是它的第一个,异常不会在堆栈中进一步。

用检查 isInterrupted() 来膨胀这些方法是否正确?

取决于上下文。检查通常会在一些关键代码之前添加。通常,它被添加为循环块中的第一项。

在catch InterruptedException块的末尾,我必须执行“return”或“null”特定值才能使Thread可用于GC吗?如果我重新创建Thread,初始化所需的时间会比平时长。

不。一旦线程从 run() 方法中存在,它就会任由 GC 摆布。共享变量不会被GC化,只要它们仍然被其他对象引用。

 类似资料:
  • 所有的, 现在,我试图避免的是下面的连接语句代码,其中我将代码包装在goroutine中的错误处理中(类似于以下内容): 相反,如果存在连接问题,我宁愿将整个过程短路,然后立即以错误退出goroutine,我也不愿意担心如何构造代码。我也许可以进一步包装_send_ack并将通道作为函数参数发送--但是如果程序是高度分层的,这就变得不确定了。例如,我可能有一个由几个函数组成的goroutine,每

  • 问题内容: 我最近一直在尝试使用logback,并且一直在Eclipse内部直接运行示例。当我这样做时,我注意到- 即使在我的静态方法结束之后(从Java驱动程序类内部),应用程序仍在运行。 最终,我确定Logback正在管理自己的线程,这些线程即使在我的主应用程序退出后仍保持活动状态。我四处搜寻一些解决方案,发现这是从Java内部显式关闭Logback的一种方式: 这真的是彻底关闭登录的唯一方法

  • 问题内容: 一个没有stopServer功能的RMI服务器,可以正常工作。 每当被调用异常中的stopServer()抛出时 这是堆栈跟踪 即使我使用清理服务对象,情况也一样 有人可以提出一种干净的方法来停止服务器,这还会释放端口以供重用。 问题答案: 您需要存储结果并取消导出结果。目前,您正在尝试取消导出存根。

  • 问题内容: 这是我的问题:我有一个对话框,其中包含一些用户可以更改的参数(例如,通过微调器)。每次更改这些参数之一时,我都会启动一个线程以根据新的参数值更新3D视图。如果在第一个线程正在工作时用户更改了另一个值(或通过单击微调箭头多次再次更改了相同的值),我想中止第一个线程(以及3D视图的更新)并启动一个新线程具有最新的参数值。 我该怎么做? PS:我的线程的方法中没有循环,因此检查标志不是一个选

  • 问题内容: 我写了一个线程,它花费太多时间执行,而且似乎还没有完全完成。我想优雅地停止线程。有什么帮助吗? 问题答案: 做到这一点的好方法是让一个线程保护一个Thread的变量,并在你要停止它的时候将其设置为外部变量,例如: `class MyThread extends Thread { volatile boolean finished = false; public void stopMe(

  • 本文向大家介绍Java 停止线程需要注意的地方,包括了Java 停止线程需要注意的地方的使用技巧和注意事项,需要的朋友参考一下 Java中停止线程的原则是什么? 在 Java 中, 最好的停止线程的方式是使用中断 interrupt, 但是这仅仅是会通知到被终止的线程 "你该停止运行了", 被终止的线程自身拥有决定权 (决定是否、以及何时停止), 这依赖于请求停止方和被停止方都遵守一种约定好的编码