笔记:ThreadPoolExecutor的maximumPoolSize,workQueue运行顺序

前情
今天想修改tomcat自动化的地方,原先的需求是单机tomcat查询出任务后自己启动线程运行(即做生产者又做消费者),现在tomcat变成集群了,想要改成tomcat集群一起运行(生产者-消费者分离),设计的过程中想起原先用的线程池做控制消费者数量,当时没有细看就百度找了几篇博客大体上熟悉了一下,现在正好看看api了解一下,就翻JDK api看,刚好看到ThreadPoolExecutor类的介绍时有一个排队机制。
ThreadPoolExecutor的排队机制
what???这个的意思是先启动corePoolSize数量的线程,之后的任务加入到等待队列中,当等待队列满时,再将运行的线程扩大到maximumPoolSize数量。这和我之前理解的不对啊,不是现将运行的线程扩大到maximumPoolSize数量再将之后的任务加入等待队列中吗?遂进行了下面的实验:

package com.hh;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

class ThreadA extends Thread {
	public void run() {
		System.out.println(Thread.currentThread().getName() + "运行开始了");
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName() + "运行结束了");
	}
}

class SimpleThreadFactory implements ThreadFactory {
	private AtomicInteger index = new AtomicInteger();
	public Thread newThread(Runnable r) {
		Thread thread = new Thread(r);
		thread.setName("线程" + index.getAndIncrement() );
		return thread;
	}
}

/**
 * 线程池测试,内容:
 * 		ThreadPoolExecutor线程池是先扩展到maximumPoolSize再加入到队列?
 * 				还是先加入队列直到队列满后在扩展到maximumPoolSize线程运行
 * @author hh
 *
 */
public class Test2 {
	public static void main(String[] args) {
		ThreadPoolExecutor t = new ThreadPoolExecutor(5, 30, 1, TimeUnit.SECONDS, new LinkedBlockingQueue(30), new SimpleThreadFactory());
		for (int i = 0; i < 35; i++) {
			ThreadA a = new ThreadA();
			t.execute(a);
		}
		t.shutdown();
	}
}

我先将任务的数量设置成 corePoolSize + 队列长度的数量,然后将运行情况打印,结果如图:
笔记:ThreadPoolExecutor的maximumPoolSize,workQueue运行顺序_第1张图片
这里一直有5个线程运行,所以基本上已经完全推翻了我之前理解的了。我又突然想到,当它队列满时,又多创建了几个线程后,是将任务全部运行完才销毁还是运行到队列不满时就销毁呢?所以又进行了一次实现,将任务数设置成: 任务数 > corePoolSize + 队列长度的数量 && 任务数 < maximumPoolSize
笔记:ThreadPoolExecutor的maximumPoolSize,workQueue运行顺序_第2张图片
运行结果如下:
笔记:ThreadPoolExecutor的maximumPoolSize,workQueue运行顺序_第3张图片
基本上说明:这8个线程只有等所有任务全部结束才销毁的。
笔记:ThreadPoolExecutor的maximumPoolSize,workQueue运行顺序_第4张图片
笔记:ThreadPoolExecutor的maximumPoolSize,workQueue运行顺序_第5张图片

你可能感兴趣的:(java)