java在超时值后杀死线程[重复]
Posted
技术标签:
【中文标题】java在超时值后杀死线程[重复]【英文标题】:java killing a thread after timeout value [duplicate] 【发布时间】:2012-11-18 02:07:48 【问题描述】:我在 java 中有一个要求,我希望线程在特定时间段后死亡并杀死自己,比如在它开始处理 1 分钟后。 java是否提供了一种方法?
这里要添加的一件事是我正在使用 ThreadPoolExecutor 并将 RUNnable 对象提交给 ThreadPoolExecutor 以在队列中执行。这是我们框架的一部分,我无法删除 ThreadPoolExecutor。鉴于此,我该如何使用 ExecutorService?
【问题讨论】:
你想用这个线程实现什么? IO 任务? 不是 IO 任务,该线程调用了第三方 web 服务,并且挂起超过 15 分钟。因此我想消除这个线程 那是IO。任何流式传输(例如调用 Web 服务,连接到服务器)都是 IO。在这种情况下,只需关闭它正在使用的 Socket。不是最优雅的解决方案,但它应该可以工作。 【参考方案1】:和this 一样的问题。请使用ExecutorService
执行Runnable
【讨论】:
ExecutorService
在线程创建和销毁过快时往往表现不佳。似乎它经常被卡在关闭线程中。你知道其他的选择吗?【参考方案2】:
你不能只是“杀死线程”,因为线程可以持有锁或其他资源(如文件)。而是将stop
方法添加到您在线程中执行的Runnable
,这将设置内部标志并定期在run
方法中检查它。像这样:
class StopByPollingThread implements Runnable
private volatile boolean stopRequested;
private volatile Thread thisThread;
synchronized void start()
thisThread = new Thread(this);
thisThread.start();
@Override
public void run()
while (!stopRequested)
// do some stuff here
// if stuff can block interruptibly (like calling Object.wait())
// you'll need interrupt thread in stop() method as well
// if stuff can block uninterruptibly (like reading from socket)
// you'll need to close underlying socket to awake thread
try
wait(1000L);
catch (InterruptedException e)
e.printStackTrace();
synchronized void requestStop()
stopRequested = true;
if (thisThread != null)
thisThread.interrupt();
此外,您可能还想阅读 Goetz 的 Java 并发实践。
【讨论】:
【参考方案3】:将ExecutorService
与Future.get
或invoke*
样式方法一起使用,这应该可以满足您的需求。但是,您始终可以简单地定期检查线程内是否已达到超时,以便线程可以正常退出。
【讨论】:
【参考方案4】:您可以中断线程,但根据您在工作线程中执行的操作,您需要手动检查 Thread.isInterrupted()。详情请见this。
【讨论】:
【参考方案5】:您可以尝试 Thread.interrupt() 并在线程本身中使用 Thread.isInterrupted() 检查中断。或者,如果你的线程休眠了一段时间,那么就在 InterruptedException 上退出。这对你正在做的事情真的很重要。如果您正在等待 IO 任务,请尝试关闭流并在 Thread 中抛出 IOException 时退出。
【讨论】:
以上是关于java在超时值后杀死线程[重复]的主要内容,如果未能解决你的问题,请参考以下文章