结束时间超过纪元:ThreadPoolExecutor希望keepAliveTime <=最长unix时间

时间:2018-07-21 18:02:01

标签: java multithreading threadpool

为什么

new ThreadPoolExecutor(
   Runtime.getRuntime().availableProcessors(), 
   Integer.MAX_VALUE, 
   Long.MAX_VALUE,
   TimeUnit.SECONDS, 
   new LinkedBlockingQueue<Runnable>()
);

在32位系统上记录“注意:结束时间超过纪元”吗?


背景故事。使用上述代码时,我观察到了奇怪的日志消息(“注意:结束时间超过了纪元”)。该消息在Google上产生了几次点击(one noting that消息“可能是我最喜欢的神秘Android错误”),但我没有找到诊断。它并没有造成问题,但是好奇心驱使我进行调试,而我的诊断出现在下面,我希望它可以节省一些时间。

2 个答案:

答案 0 :(得分:0)

因为keepAliveTime = Long.MAX_VALUE大于最大32位Unix时间(2 ^ 31-1 = 2,147,483,647)。您可以通过将Long.MAX_VALUE替换为2147483647(最好是使用常量Integer.MAX_VALUE来避免日志消息)。

答案 1 :(得分:0)

根据构造函数的official documentation,时间单位应为TimeUnit.NANOSECONDS,而不是TimeUnit.SECONDS

  

使用Long.MAX_VALUE TimeUnit.NANOSECONDS值可以有效地禁止空闲线程在关闭之前终止。默认情况下,仅当corePoolSizeThreads个以上时,保持活动策略才适用。但是,只要keepAliveTime值不为零,方法allowCoreThreadTimeOut(boolean)还可用于将此超时策略应用于核心线程。

new ThreadPoolExecutor(
    Runtime.getRuntime().availableProcessors(), 
    Integer.MAX_VALUE, 
    Long.MAX_VALUE,
    TimeUnit.NANOSECONDS, 
    new LinkedBlockingQueue<Runnable>()
);

  

Long.MAX_VALUE =一个常数,该常数保存long可以具有的最大值2 ^ 63-1。