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

Java 检测线程是否排队/工作过度,java,multithreading,performance,Java,Multithreading,Performance,在Java中,很多TCP连接(MINA)都在为一个给定的线程创建工作,有时这个线程会过度工作,排队等待。我想知道一种在进程中监视这一点的好方法,以便应用程序在线程陷入困境时减少其工作负载。基本上,我知道的唯一方法是放弃线程上的监视任务,偶尔轮询看看它们是否已完成,但我觉得应该有更直接的方法。如果我理解正确,任务将排队等待线程处理,您需要一种方法来确保队列不会像以前那样不精确地增长当线程无法跟上时,工作负载会增加 您可以使用一个有界队列,这样一旦队列达到容量,您就知道线程无法处理,您可以等待/减少

在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();
threadPool.setRejectedExecutionHandler(new RejectedExecutionHandler() {
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
       // this will block if the queue is full
       executor.getQueue().put(r);
    }
});