java在超时值后杀死线程[重复]

Posted

技术标签:

【中文标题】java在超时值后杀死线程[重复]【英文标题】:java killing a thread after timeout value [duplicate] 【发布时间】:2012-11-18 02:07:48 【问题描述】:

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

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

【问题讨论】:

你想用这个线程实现什么? IO 任务? 不是 IO 任务,该线程调用了第三方 web 服务,并且挂起超过 15 分钟。因此我想消除这个线程 那是IO。任何流式传输(例如调用 Web 服务,连接到服务器)都是 IO。在这种情况下,只需关闭它正在使用的 Socket。不是最优雅的解决方案,但它应该可以工作。 【参考方案1】:

和this 一样的问题。请使用ExecutorService 执行Runnable

【讨论】:

ExecutorService 在线程创建和销毁过快时往往表现不佳。似乎它经常被卡在关闭线程中。你知道其他的选择吗?【参考方案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 并发实践

【讨论】:

【参考方案3】:

ExecutorServiceFuture.getinvoke* 样式方法一起使用,这应该可以满足您的需求。但是,您始终可以简单地定期检查线程内是否已达到超时,以便线程可以正常退出。

【讨论】:

【参考方案4】:

您可以中断线程,但根据您在工作线程中执行的操作,您需要手动检查 Thread.isInterrupted()。详情请见this。

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于java在超时值后杀死线程[重复]的主要内容,如果未能解决你的问题,请参考以下文章

自动从终端杀死java进程[重复]

Future 超时后是不是会杀死线程?

启动Java应用程序一次并休眠还是重复启动和杀死更好?

比较重复值的唯一值后如何在excel中创建新列表

Mongoose:在设置值后,新创建的对象上的值转换为 ObjectId 失败 [重复]

Mongoose:在设置值后,新创建的对象上的值转换为 ObjectId 失败 [重复]