1

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

4

2 回答 2

2

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

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

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 提到的,您可以绑定队列,以便除非有空间,否则不会将其他作业放入队列中。这会减慢工作生产者的速度,但不会使事情运行得更快。定义线程池后,您可以设置一个拒绝处理程序,它将阻止生产者而不是抛出异常。

threadPool.setRejectedExecutionHandler(new RejectedExecutionHandler() {
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
       // this will block if the queue is full
       executor.getQueue().put(r);
    }
});
于 2012-11-21T21:20:10.623 回答
0

如果我理解正确,任务排队等待由线程处理,并且您需要一种方法来确保队列不会随着工作负载的增加而无限增长而线程无法赶上。

您可以使用有界队列,这样一旦队列达到容量,您就知道线程无法处理并等待/减少工作量(您的 OP 非常抽象,所以我的回答也是从鸟瞰的角度)直到队列开始清除

于 2012-11-21T21:03:55.653 回答