Java线程池的核心参数有哪些?
1、corePoolSize
核心线程数,即就是中线程池中长时间稳定存活的线程数
2、maxPoolSize
最大线程数,重点强调线程中最大可包含的线程数。最大线程数的上限需要根据实际情况而定
3、keepAliveTime
线程的存活时间,该参数是指非核心线程的存活时间,用来严格控制线程池中线程的数量尽可能的保持在一定的范围内,若要修改核心线程的存活时长,可参考相关参数
4、时间单位
TimeUnit.SECONDS:秒
5、队列容量大小
1.直接交换:SynchronousQueue,任务不多,是没有容量的,maxPoolSize需要大一点
2.无界队列:LinkedBlockingQueue,可产生OOM
3.有界队列:ArrayBlockingQueue
6、拒绝策略
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。 ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。 ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务 ThreadPoolExecutor.CallerRunsPolicy:由调用线程(提交任务的线程)处理该任务
二、代码
package com.thread;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class Reject {
public static void main(String[] args) {
//创建一个核心线程为3 ,最大线程为5的,空闲时间0 ,单位,队列容量大小,拒绝策略为直接抛出异常
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 5, 0, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(1), new ThreadPoolExecutor.DiscardPolicy());
for (int i=0;i<15;i++){
threadPoolExecutor.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "runing.....");
}
});
}
//关闭线程池
threadPoolExecutor.shutdown();
}
}
线程池线程该怎么分配?依据是什么?
视情况而定
Future futureTask Runnable Callable的区别?
链接:[https://blog.csdn.net/bboyfeiyu/article/details/24851847]