java超时后杀死一个线程的值

java killing a thread after timeout value

本问题已经有最佳答案,请猛点这里访问。

我在java中有一个要求,我希望线程在特定时间段之后死掉并自杀,就像它开始处理1分钟后一样。 java为此提供了一种方法吗?

这里要添加的一件事是我正在使用ThreadPoolExecutor并将RUnnable对象提交给ThreadPoolExecutor以在队列中执行。 这是我们框架的一部分,我无法删除ThreadPoolExecutor。 鉴于此,我如何使用ExecutorService?


这是同样的问题。请使用ExecutorService执行Runnable


你不能只是"杀死线程",因为线程可以持有锁或其他资源(如文件)。而是将stop方法添加到Runnable中,在线程中执行,这将设置内部标志并定期在run方法中检查它。像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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并发。


使用ExecutorServiceFuture.getinvoke*样式方法,这应该给你你想要的。但是,您始终可以在线程内定期检查是否已达到超时,以便线程可以正常退出。


您可以尝试Thread.interrupt(),并在线程本身使用Thread.isInterrupted()检查中断。或者,如果您的线程休眠了一段时间,那么只需退出InterruptedException。这对你正在做的事情非常重要。如果您正在等待IO任务,请尝试关闭该流并退出线程中抛出的IOException。


您可以中断线程,但根据您在工作线程中的操作,您需要手动检查Thread.isInterrupted()。有关详细信息,请参见