1

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

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

4

5 回答 5

2

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

于 2012-11-29T21:46:56.657 回答
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 concurrency in practice

于 2012-11-29T21:55:53.117 回答
1

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

于 2012-11-29T21:47:03.147 回答
0

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

于 2012-11-29T21:47:07.960 回答
0

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

于 2012-11-29T21:48:45.333 回答