gpt4 book ai didi

java - 线程停止运行后不会被删除

转载 作者:行者123 更新时间:2023-11-29 05:19:56 25 4
gpt4 key购买 nike

我有一个在线程上运行的服务。当我需要线程停止运行时,我正在使用这段代码
this.serviceThread.interrupt();
this.serviceThread = null;

有时我需要重新创建线程

this.serviceThread = new Thread() 
{
public void run()
{
TheService.this.serviceProcessThread();
}
};
this.serviceThread.start();

但是,它仍然看起来像以前的 Thread 仍然存在并正在运行,因为它列在当前正在运行的线程列表中。每次我尝试停止并创建新线程时,此列表都会不断增长。这是正常的吗?无论如何我可以摆脱那些旧线程吗?

我主要只是想知道线程列表是否意味着它们仍然存在,如果存在,我该如何删除它们。谢谢!

编辑:这就是我处理运行/停止线程的方式

public void startProcessThread()
{
this.shutdown = false;
this.serviceThread = new Thread()
{
public void run()
{
TheService.this.serviceProcessThread();
}
};
this.serviceThread.start();
}
private void serviceProcessThread()
{
do
{
try
{
this.getCommands();

if (this.tasks.size() > 0)
this.processTasks();

if (!this.shutdown)
{
Thread.sleep(ServiceSleepTime);
}
}
catch (Exception e)
{
this.logException("serviceProcessThread", e);
}
}
while (!this.shutdown);
if(this.serviceThread != null)
{
this.serviceThread.interrupt();
this.serviceThread = null;

}

}

最佳答案

您必须面对的第一件事是,如果不对整个 Java 进程产生潜在的不利影响,就不能强行停止线程。这就是为什么 Java 引入了线程中断的机制:一种通用的、协作机制来优雅地停止线程。

协作 方面是关键:无论您在线程的实现代码中做什么,都必须确保它是可中断的。一个简短的 list :

  • 如果您有阻塞调用(那些在等待条件时停止线程的调用),它们必须是可中断的(基本上,声明抛出 InterruptedException);

  • 您必须正确捕获并处理 InterruptedException,方法是执行任何适当的清理并使顶级 run 方法返回;

  • 如果您实现了一个长时间运行的循环,您必须确保它定期检查 Thread.currentThread().isInterrupted() 标志,并在线程被中断时中断;

  • 如果您放弃对任何第 3 方代码的控制,请确保该代码是可中断的。

另外请记住,作为 Java 对象的 Thread 的生命周期与实际执行的线程无关。 Thread 只是一个句柄对象,让您可以管理底层线程,就像 File 是文件系统实体的句柄一样。将 File 引用设置为 null 不会从系统中删除文件。

更新

您的实现代码可以通过不吞并 InterruptedException 来修复。

    try {
this.getCommands();
if (this.tasks.size() > 0)
this.processTasks();
if (!this.shutdown)
Thread.sleep(ServiceSleepTime);
}
catch (InterruptedException e) {
this.shutdown = true;
}
catch (Exception e)
{
this.logException("serviceProcessThread", e);
}

此外,这部分是多余的:

if(this.serviceThread != null)
{
this.serviceThread.interrupt();
this.serviceThread = null;

}

在这里您试图中断您自己的(当前)线程。重点是线程应该被另一个线程中断。

关于java - 线程停止运行后不会被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25185521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com