我在java中有一个要求,我希望线程在特定时间段之后死掉并自杀,就像它开始处理1分钟后一样。 java是否为此提供了一种方法?
这里要添加的一件事是我正在使用ThreadPoolExecutor并将RUnnable对象提交给ThreadPoolExecutor以在队列中执行。这是我们框架的一部分,我无法删除ThreadPoolExecutor。鉴于此,我如何使用ExecutorService?
答案 0 :(得分:2)
问题就像this一样。请使用ExecutorService
执行Runnable
答案 1 :(得分:1)
使用ExecutorService
Future.get
或invoke*
样式方法,可以为您提供所需内容。但是,您始终可以在线程内定期检查是否已达到超时,以便线程可以正常退出。
答案 2 :(得分:1)
你不能只是“杀死线程”,因为线程可以持有锁或其他资源(如文件)。而是将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 :(得分:0)
您可以中断线程,但是根据您在工作线程中的操作,您需要手动检查Thread.isInterrupted()。有关详细信息,请参阅this。
答案 4 :(得分:0)
您可以尝试Thread.interrupt()并在线程本身使用Thread.isInterrupted()检查中断。或者,如果您的线程休眠了一段时间,那么只需退出InterruptedException。这对你正在做的事情非常重要。如果您正在等待IO任务,请尝试关闭流并退出线程中抛出的IOException。