24.javase-基础加强-线程二(线程池)

线程池

线程池的优点:
1、线程是稀缺资源,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以重复使用。
2、可以根据系统的承受能力,调整线程池中工作线程的数量,防止因为消耗过多内存导致服务器崩溃。

一.Executors创建线程池

1.Executors创建线程池
特点:
便捷,不需要指定参数.
因为隐藏了线程池的创建细节,很可能导致OOM.

2.Executors.创建几种线程的方式.
在这里插入图片描述
3.总结,我们一般尽量避免直接用Executors创建线程.

二.ThreadPoolExecutor创建线程池

创建线程池:

 public class TestTreadPool2 {
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		ThreadPoolExecutor pool = new ThreadPoolExecutor(3,//corePoolSize(正式员工数量)
				10, //maximumPoolSize(正式工家临时工所有的线程数之和)
				10L, TimeUnit.SECONDS, //临时工超时时间
				new ArrayBlockingQueue<>(512), //队列容量
				Executors.defaultThreadFactory(),//线程创建方式
				new ThreadPoolExecutor.DiscardPolicy());//拒绝策略
		
		//提交带返回值的任务(callable)
		Future<String> result = pool.submit(new Callable<String>() {
			@Override
			public String call() throws Exception {
				System.out.println("i am gl");
				System.out.println(Thread.currentThread().getName());
				return "gl";
			}
		});
		//获取线程的返回值
		System.out.println("返回值结果是:" + result.get());
		
		//提交不需要返回值的任务(Runnable)
		pool.execute(new Runnable() {
			
			@Override
			public void run() {
				System.out.println(Thread.currentThread().getName());
				System.out.println("我爱中国");
			}
		});
	}

上述的线程池的参数说明:
corePoolSize
核心池的大小,核心线程数.
刚创建的线程是没有线程的.初始化现成的方式:
a.prestartCoreThread():初始化一个核心线程
b.prestartAllCoreThreads():初始化所有核心线程
c.当有任务来时,初始化线程.
maximumPoolSize
线程池最大线程数,这个参数也是一个非常重要的参数,它表示在线程池中最多能创建多少个线程;
keepAliveTime
默认是临时线程超时时间.但是如果调用了allowCoreThreadTimeOut(boolean)方法,在线程池中的线程数不大于corePoolSize时,keepAliveTime参数也会起作用,直到线程池中的线程数为0;
unit
参数keepAliveTime的时间单位,有7种取值,在TimeUnit类中有7种静态属性:
TimeUnit.DAYS; //天 TimeUnit.HOURS; //小时
TimeUnit.MINUTES; //分钟 TimeUnit.SECONDS; //秒
TimeUnit.MILLISECONDS; //毫秒 TimeUnit.MICROSECONDS; //微妙
TimeUnit.NANOSECONDS; //纳秒 复制代码
workQueue
一个阻塞队列,用来存储等待执行的任务,这里的阻塞队列有以下几种选择:
ArrayBlockingQueue;
LinkedBlockingQueue;
SynchronousQueue;
说明:ArrayBlockingQueue和PriorityBlockingQueue使用较少,一般使用LinkedBlockingQueue和Synchronous。线程池的排队策略与BlockingQueue有关。

threadFactory
线程工厂,主要用来创建线程;
RejectedExecutionHandler
表示当拒绝处理任务时的策略,有以下四种取值:
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务

1.线程池执行顺序
corePoolSize -> 任务队列 -> maximumPoolSize -> 拒绝策略

2.提交任务的方式
在这里插入图片描述

发布了42 篇原创文章 · 获赞 0 · 访问量 662

猜你喜欢

转载自blog.csdn.net/weixin_45449911/article/details/104513231
今日推荐