java ThreadPoolExecutor超时不被遵守

标签 java multithreading timeout threadpoolexecutor

在我的应用程序中,我们使用了线程池,我们为线程池指定了超时,但似乎没有调用超时,下面是代码:

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class ThreadPoolDemo extends Thread{

public void run(){
    System.out.println("Starting---" + new Timestamp((new Date()).getTime())  + "--" + Thread.currentThread().getName());
    try {
        Thread.sleep(30000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println("Finishing---" + new Timestamp((new Date()).getTime())  + "--" +Thread.currentThread().getName());
}

public static void main (String[] args){
    ArrayBlockingQueue<Runnable> threadQueue = new ArrayBlockingQueue<Runnable>(5);
    ThreadPoolExecutor thumbnailGeneratorThreadPool = new ThreadPoolExecutor(1, 3,
            5, TimeUnit.SECONDS, threadQueue);
    thumbnailGeneratorThreadPool.allowCoreThreadTimeOut(true);
    ArrayList fTasks = new ArrayList();
    for (int i = 0; i < 15; i++) {
        System.out.println("Submitting Thread : " + (i+1) + "- Current Queue size is : " + threadQueue.size());
        ThreadPoolDemo tpd = new ThreadPoolDemo();
        Future future = thumbnailGeneratorThreadPool.submit(tpd);
    }
    }
}

代码的输出是:

Submitting Thread : 1- Current Queue size is : 0
Submitting Thread : 2- Current Queue size is : 0
Submitting Thread : 3- Current Queue size is : 1
Submitting Thread : 4- Current Queue size is : 2
Submitting Thread : 5- Current Queue size is : 3
Submitting Thread : 6- Current Queue size is : 4
Submitting Thread : 7- Current Queue size is : 5
Submitting Thread : 8- Current Queue size is : 5
Submitting Thread : 9- Current Queue size is : 5
Exception in thread "main" java.util.concurrent.RejectedExecutionException
    at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1774)
    at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:768)
    at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:656)
    at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:78)
    at ThreadPoolDemo.main(ThreadPoolDemo.java:33)
Starting---2016-10-26 14:20:16.254--pool-1-thread-2
Starting---2016-10-26 14:20:16.254--pool-1-thread-3
Starting---2016-10-26 14:20:16.254--pool-1-thread-1
Finishing---2016-10-26 14:20:46.261--pool-1-thread-1
Finishing---2016-10-26 14:20:46.261--pool-1-thread-2
Finishing---2016-10-26 14:20:46.261--pool-1-thread-3
Starting---2016-10-26 14:20:46.261--pool-1-thread-2
Starting---2016-10-26 14:20:46.261--pool-1-thread-3
Starting---2016-10-26 14:20:46.261--pool-1-thread-1
Finishing---2016-10-26 14:21:16.265--pool-1-thread-1
Starting---2016-10-26 14:21:16.265--pool-1-thread-1
Finishing---2016-10-26 14:21:16.265--pool-1-thread-3
Starting---2016-10-26 14:21:16.265--pool-1-thread-3
Finishing---2016-10-26 14:21:16.265--pool-1-thread-2
Finishing---2016-10-26 14:21:46.277--pool-1-thread-1
Finishing---2016-10-26 14:21:46.277--pool-1-thread-3

现在,在 ThreadPoolExecutor 中,keepAliveTime 设置为 5 秒。

但是,如果我们看到输出,则线程需要 30 秒才能完成。我不确定为什么线程上的 ThreadPoolExecutor 没有调用 InterruptedException

我想要一种机制来停止线程,如果线程在指定的超时后仍然处于 Activity 状态。

最佳答案

正如评论中已经指出的,您没有指定超时。您仅指定了 ThreadPoolExecutor 的保持 Activity 时间。 keep-alive 不会终止或中断正在运行的线程,而只会释放 Executor 的空闲线程(请参阅 getKeepAliveTime )。

如果您想为任务设置超时,则必须使用 invokeAllinvokeAny方法而不是submit。 另请参阅

关于java ThreadPoolExecutor超时不被遵守,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40258007/

相关文章:

java - BST 和随机 BST 的区别

java - 将 java.sql.Time 对象注入(inject)到 bean 中 - spring xml 依赖注入(inject)

java - 单元测试未初始化

c - Erlang c-nodes 随机崩溃,并出现双重释放、内存损坏 malloc 消息

java - 等待线程的开销是多少?

javascript - 通过 javascript 加载缓慢的外部文件时,有什么方法可以优雅地强制执行超时限制?

java - spring autowire 不工作返回 null

python - 如何在python中实现线程socket.recv()?

php - 在mysql中导入巨大的txt超时

java - HttpTimeoutException 和 TimeoutException 之间的区别