线程池解决的问题:手动创建线程,频繁的开启关闭线程会消耗更多资源,而线程池的引入则会避免这个问题。
// 创建一个可以根据需要创建新线程的线程池。最多可以创建int最大值的线程数量
public static ExecutorService newCachedThreadPool()
// 创建一个固定长度的线程池
public static ExecutorService newFixedThreadPool(int nThreads)
// 创建单个线程的线程池
public static ExecutorService newSingleThreadExecutor()
// 创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
声明线程池
ExecutorService executorService = Executors.newCachedThreadPool();
实现Runnable接口,创建线程任务
//提交线程任务
executorService.submit(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"执行了");
}
});
线程池对应参数:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
参数解释:
corePoolSize - 核心线程数。
maximumPoolSize - 最大线程数。
keepAliveTime - 临时线程存活的时间。
unit - keepAliveTime 时间单位。
workQueue - 阻塞队列。
threadFactory - 创建线程的工厂。
handler - 如果超过最大线程数,的拒绝方案。
创建线程池的演示
ThreadPoolExecutor poolExecutor=new ThreadPoolExecutor(
6, //核心线程数
9, //最大线程数
3, //空闲时间
TimeUnit.SECONDS, //时间单位:秒
new ArrayBlockingQueue<>(10),
Executors.defaultThreadFactory(), //默认的工厂对象,由工厂对象帮我们生产线程
new ThreadPoolExecutor.AbortPolicy() //拒绝的方式
);
拒绝策略
//用于被拒绝任务的处理程序,它将抛出 RejectedExecutionException.
static class ThreadPoolExecutor.AbortPolicy
//用于被拒绝任务的处理程序,它直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务。
static class ThreadPoolExecutor.CallerRunsPolicy
//用于被拒绝任务的处理程序,它放弃最旧的未处理请求,然后重试 execute;如果执行程序已关闭,则会丢弃该任务。
static class ThreadPoolExecutor.DiscardOldestPolicy
//用于被拒绝任务的处理程序,默认情况下它将丢弃被拒绝的任务。
static class ThreadPoolExecutor.DiscardPolicy
————————————————
版权声明:本文为优快云博主「道也自由」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/weixin_47873769/article/details/113624615