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