【发布时间】:2018-01-17 23:16:27
【问题描述】:
用例:每次我需要处理作业时都创建一个新线程。
当前实现:我正在使用具有固定大小线程池的执行器服务,例如 50 个。对于每个作业,我都会向执行器服务提交一个新线程。
问题:一旦作业完成,线程不会死亡并进入等待状态。 (在 sun.misc.unsafe.park 等待)
分析:根据这个链接(WAITING at sun.misc.Unsafe.park(Native Method))和网上的其他来源,这是一个有效的场景,线程进入等待状态,等待一些任务给他们。
问题:从 Java 任务控制中,我能够推断出线程没有使用任何资源并且没有处于死锁状态。所以这很好。但是考虑一个提交大量作业并且池中所有 50 个线程都被实例化的时间范围。在那之后,所有 50 个线程都将处于活动状态,即使作业提交率可能已经下降。我也无法关闭执行程序服务,因为它需要永远活着等待提交作业。 如果我创建普通线程,我会看到线程在完成工作后死亡。但在这种情况下,正在创建的最大线程数中没有选项卡。因此,在高峰期,我们可能会遇到创建的线程数超过 JVM 可以处理的线程数的情况。
如何以最佳方式处理这种情况。我们应该忽略处于等待状态的线程还是应该进行任何其他实现。
我试图实现的行为更像是自动缩放。在高峰时间跨越更多服务器(在这种情况下为线程)。并在负载不那么高时终止额外的服务器并保持最少的服务器数量。
【问题讨论】:
-
这不是对象池的预期行为吗?
-
这可能是线程池的默认行为。但在我的情况下,所有线程在高峰时间都处于活动状态,之后它们总是处于等待状态,之后一次只会使用很少的线程。所以想知道 Executor Service 是否还有其他设置可以使用。或任何其他可以解决这种情况的实现。
-
如果您希望每个作业都有一个新线程,为什么要使用
ExecutorService?如果你不这样做,你为什么要说第一句话? -
@EJP.. 如果我要为每个作业创建一个新线程,使用 new Thread(new My Runnable()).start.. 那么我如何密切关注峰值期间创建的最大线程数次。不会出现在达到最大资源时抛出异常的情况。这就是我尝试使用并发包提供的线程创建框架的原因。我的要求是通过创建线程来处理所有作业,但如果线程在“n”毫秒内没有收到任何作业,则终止线程。更像是自动缩放功能,您可以在高峰时段跨越更多服务器,并在不需要时关闭它们。
标签: java multithreading executorservice