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

时间:2012-11-29 21:45:01

标签: java

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

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

5 个答案:

答案 0 :(得分:2)

问题就像this一样。请使用ExecutorService执行Runnable

答案 1 :(得分:1)

使用ExecutorService Future.getinvoke*样式方法,可以为您提供所需内容。但是,您始终可以在线程内定期检查是否已达到超时,以便线程可以正常退出。

答案 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。