当前位置: 首页 > 面试题库 >

线程应如何在Java中自行关闭?

韩耘豪
2023-03-14
问题内容

这是一个简短的问题。在某些时候,我的线程知道应该自杀。最好的方法是什么:

  1. Thread.currentThread()。interrupt();
  2. 返回;

顺便说一句,为什么在第一种情况下我们需要使用currentThread?是Thread不是指当前线程?


问题答案:

如果要终止 线程
,则只需返回即可。您不需要调用Thread.currentThread().interrupt()(尽管它不会做任何坏事。只是您不需要这样做。)这是因为interrupt()基本上是用来通知线程所有者的(不是,不是100%准确,而是某种程度的)
)。因为您是线程的所有者,并且您决定终止该线程,所以没有人要通知,因此您无需调用它。

顺便说一句,为什么在第一种情况下我们需要使用currentThread?线程不是指当前线程吗?

是的,不是。我想这可能会造成混淆,因为例如Thread.sleep()影响当前线程,但是Thread.sleep()是静态方法。

如果您不是线程的所有者(例如,如果您尚未扩展Thread和编码Runnable等),则应该这样做

Thread.currentThread().interrupt();
return;

这样,任何调用您的runnable的代码都将知道该线程已被中断=(通常)应停止其正在执行的操作并终止。正如我前面所说,这只是一种沟通机制。所有者可能只是不理会中断状态,什么也不做。.但是,如果您确实设置了中断状态,将来有人会感谢您。

出于同样的原因,您绝对不应该这样做

Catch(InterruptedException ie){
     //ignore
}

因为如果这样做,您将在此处停止消息。相反,应该做

Catch(InterruptedException ie){
    Thread.currentThread().interrupt();//preserve the message
    return;//Stop doing whatever I am doing and terminate
}


 类似资料:
  • 问题内容: 目的是能够从 主类中* 调用 单独线程的 执行。 * 一些上下文:我有一个必须运行 进程的程序 。仅当主程序执行完毕并从内存中卸载时,该进程 (一个cmd程序)才 应运行。 我应该在 主类中 包括哪些代码? 问题答案: 如果您的意思是: 如何启动一个Java线程,当我的JVM(Java程序)运行时,该线程不会结束? 。 因为在Java中,如果JVM退出,则所有线程均已完成。这是一个例子

  • 问题内容: 我正在创建一个Android应用程序,该应用程序必须在后台执行Web请求,然后处理接收到的数据并根据服务器响应修改用户界面。 在后台发布请求和处理数据的目的是避免冻结用户界面。但是目前,我注意到用户界面处于冻结状态,因此我不确定逻辑是否按预期工作。 这是代码的一部分,应该在其自己的线程中发布请求并处理响应,然后将数据传递给GUI: 从实现ServerResponseHandler的主要

  • 问题内容: 如何java.lang.Thread用Java 杀死A ? 问题答案: 有关他们为何不赞成使用Sun的内容,请参见此主题。它详细介绍了为什么这是一种不好的方法,以及通常应该采取什么措施才能安全地停止线程。 他们建议的方式是使用共享变量作为标志,要求后台线程停止。然后可以由另一个请求线程终止的对象来设置此变量。

  • 问题内容: 我已经用GUI制作了一个Java程序,并且想要一个停止按钮功能,其中当用户单击停止按钮时,必须停止该程序。 在我的程序中,主线程启动其他10个线程,我希望每当单击“停止”按钮时,所有10个线程都必须在主线程之前停止。 其次,我还希望每当停止这10个线程中的任何一个线程时,它都必须先关闭它打开的所有资源,然后再连接数据库等。 我已经实现了.......回答的代码。 现在有一个问题。 我的

  • BilledLines=Integer.ParseInt(args[7]); Array=TaxCalc.Calculation(输入,y,BilledLines,); 返回数组; } taxouput函数是OSB中的多线程函数。现在,我想调用setup()和 cleanup(),以便setup()只对第一个线程调用,而 cleanup()只对最后一个线程调用。

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