gpt4 book ai didi

Java ExecutorService - 处于等待状态的线程

转载 作者:行者123 更新时间:2023-12-01 20:16:51 25 4
gpt4 key购买 nike

用例:每次需要处理作业时创建一个新线程。

当前实现:我使用具有固定大小线程池(例如 50 个)的执行器服务。对于每个作业,我向执行器服务提交一个新线程。

问题:作业完成后,线程不会终止并进入等待状态。 (在 sun.misc.unsafe.park 等候)

分析:根据此链接( WAITING at sun.misc.Unsafe.park(Native Method) )和网络上的其他来源,这是一个有效的场景,线程进入等待状态,等待向它们分配某些任务。

问题:从 Java 任务控制中,我可以推断线程没有使用任何资源并且没有处于死锁状态。所以这很好。但请考虑提交大量作业并且池中的所有 50 个线程都已实例化的时间范围。之后,尽管作业提交率可能有所下降,但所有 50 个线程都将处于 Activity 状态。我也无法关闭执行程序服务,因为它需要永远处于 Activity 状态,等待提交作业。如果我创建普通线程,我会看到线程在完成工作后死亡。但在这种情况下,正在创建的最大线程数中没有选项卡。因此,在高峰时间,我们可能会遇到创建的线程数量超出 JVM 处理能力的情况。

如何以最佳方式处理这种情况。我们应该忽略处于等待状态的线程还是应该采用任何其他实现。

我试图实现的行为更像是自动缩放。在高峰时段跨越更多服务器(在本例中为线程)。当负载不是那么高时,终止额外的服务器并维持最小的服务器数量。

最佳答案

And after that all the 50 threads are going to be alive even though the job submission rate might have decreased. I cannot shut down the executor service also, since it needs to be alive forever waiting for jobs to be submitted.

...

How can this scenario be handled in the best possible way. Should we ignore the threads being in the waiting state or should I go for any other implementation.

我认为答案是,你应该忽略它们。如今,线程的效率非常高,当然 50 个 hibernate 线程不会以任何方式影响应用程序的运行时间。如果您谈论的是大量线程或一系列不同的线程池,情况会有所不同。

也就是说,如上所述,如果您希望线程超时,那么您将需要指定与“最大”(池可以运行的最大数量)不同的“核心”线程数(应始终运行多少个线程)也会增长)以及线程在退出之前应开始 hibernate 多长时间,以将线程计数保持在“核心”数量。这样做的问题是,您需要有一个固定大小的作业队列,否则永远不会创建第二个线程。 (不幸的是)这就是 ThreadPoolExecutor 的工作原理。

如果您有不同的核心和最大线程数,并且要向线程池提交大量作业,那么您需要阻止生产者,否则如果队列已满,作业将被队列拒绝。

类似于:

ThreadPoolExecutor threadPool = new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE,
60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(MAX_QUEUE_SIZE));
// need to say what to do if the queue is full
threadPool.setRejectedExecutionHandler(new RejectedExecutionHandler() {
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
// this will block the caller if the queue is full
executor.getQueue().put(r);
}
});

关于Java ExecutorService - 处于等待状态的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45601290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com