为什么
new ThreadPoolExecutor(
Runtime.getRuntime().availableProcessors(),
Integer.MAX_VALUE,
Long.MAX_VALUE,
TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>()
);
在32位系统上记录“注意:结束时间超过纪元”吗?
背景故事。使用上述代码时,我观察到了奇怪的日志消息(“注意:结束时间超过了纪元”)。该消息在Google上产生了几次点击(one noting that消息“可能是我最喜欢的神秘Android错误”),但我没有找到诊断。它并没有造成问题,但是好奇心驱使我进行调试,而我的诊断出现在下面,我希望它可以节省一些时间。
答案 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。