gpt4 book ai didi

java - 检测线程是否排队/过度工作

转载 作者:行者123 更新时间:2023-11-30 04:36:05 25 4
gpt4 key购买 nike

在 Java 中,我遇到一种情况,许多 TCP 连接 (MINA) 正在为给定线程创建工作,有时该线程会过度工作、排队并落后。我想知道一种在进程中监视这一点的好方法,以便应用程序在线程陷入困境时可以减少其工作负载。本质上,我知道执行此操作的唯一方法是在线程上删除监视任务,并偶尔轮询以查看它们是否已完成,但我觉得应该有更直接的方法。

最佳答案

我认为诀窍是为线程排队作业,而是拥有一个可以处理您的任务的线程池。然后,您可以更好地平衡处理任务的线程数量。

您可能想要设置线程的初始数量,但如果阻塞队列已满,则增加它。重要的是要认识到队列必须在分配超过初始大小的第一个线程之前填充。我知道这违反直觉,但这就是它的工作原理。

BlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>(QUEUE_SIZE);
ExecutorService threadPool = new ThreadPoolExecutor(NUM_INITIAL_THREADSs,
MAX_NUM_THREADS, 0L, TimeUnit.MILLISECONDS, queue);
...
// submit the jobs...
// after submitting the jobs, you need to shutdown the queue
threadPool.shutdown();

正如@Cratylus提到的,你可以绑定(bind)你的队列,这样除非有空间,否则额外的作业不会被放入队列中。这会减慢作业生产者的速度,但不会使事情运行得更快。定义线程池后,您可以设置一个拒绝处理程序,该处理程序将阻止生产者而不是抛出异常。

threadPool.setRejectedExecutionHandler(new RejectedExecutionHandler() {
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
// this will block if the queue is full
executor.getQueue().put(r);
}
});

关于java - 检测线程是否排队/过度工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13501906/

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