public class ExecutorTest {
/**
* 默认开启的线程数,
* 最大线程数,
* 所有线程都执行完毕后多长时间关闭线程池,
* 时间类型(秒、毫秒),
* 消息队列最大数量
*/
static ThreadPoolExecutor fixedThreadPool = new ThreadPoolExecutor(4,4,5000L,
TimeUnit.MILLISECONDS,new ArrayBlockingQueue(1024));
public static void main(String[] args) {
// ThreadPoolExecutor
fixTheadPoolTest();
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
fixTheadPoolTest();
}
/**
* 1.创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小
* 2.线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程
* 3.因为线程池大小为4,每个任务输出index后sleep 2秒,所以每两秒打印4个数字,和线程名称
*/
public static void fixTheadPoolTest() {
fixedThreadPool.allowCoreThreadTimeOut(true);
for (int i = 0; i < 10; i++) {
final int ii = i;
fixedThreadPool.execute(() -> {
System.out.println("线程名称:" + Thread.currentThread().getName() + ",执行" + ii);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
System.out.println("===========================");
}
}