【发布时间】:2014-08-07 14:47:11
【问题描述】:
我有一个在线程上运行的服务。当我需要线程停止运行时,我正在使用此代码this.serviceThread.interrupt();
this.serviceThread = null;
有时我需要重新创建线程
this.serviceThread = new Thread()
{
public void run()
{
TheService.this.serviceProcessThread();
}
};
this.serviceThread.start();
但是,前一个线程似乎仍然活着并且正在运行,因为它列在当前正在运行的线程列表中。每次我尝试停止并创建一个新线程时,这个列表都会不断增长。这是正常的吗?无论如何我可以摆脱那些旧线程吗?
我主要只是想知道该线程列表是否意味着它们仍然存在,如果是,我该如何删除它们。谢谢!
编辑:这就是我处理运行/停止线程的方式
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;
}
}
【问题讨论】:
-
From What does java.lang.Thread.interrupt() do? "Thread.interrupt() 设置目标线程的中断状态/标志。然后在目标线程中运行的代码可能轮询中断状态并处理适当的。某些阻塞的方法,例如 Object.wait() 可能会立即消耗中断状态并抛出适当的异常(通常是 InterruptedException)"
-
这听起来像是使用线程池的理想时机。
-
所以通过调用 .interupt() 并将其设为 null,它实际上不会摆脱线程吗?我一直在寻找合适的方法来做到这一点,但我看到的只是人们中断/停止线程并创建一个新线程。
-
@Hooplehead24 您是否可以控制线程中运行的代码。如果是这样,请使用 William F. Jameson 的回答来确保它是可交互的
-
我添加了新代码供您参考。我认为我做对了,但希望有人能告诉我我是否错误地退出了它。根据我的处理方式,我不确定它是否可以完全中断。
标签: java android multithreading service thread-safety