线程池

it2024-10-08  43

池化技术:实现准备好资源,有人要用从我这里拿,用完了,还给我。

线程池的好处:

减少资源的消耗,因为要用线程池的资源必定都是一些创建销毁都是很耗资源的东西。提高响应的速度管边管理

线程池的三大方法,7大参数,4种拒绝策略

注意:根据阿里巴巴代码规范,线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样 的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。

三大方法

# 创建一个容量的线程池 Executors.newSingleThreadExecutor(); # 创建固定容量的线程池 Executors.newFixedThreadPool(5); # 创建弹性容量的线程池 Executors.newCachedThreadPool();

三大方法的底层还是调用ThreadPollExecutor

public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())); } public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); } public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); }

七大参数就是ThreadPoolExecutor的七个构造参数

int corePoolSize,// 核心个数 int maximumPoolSize,// 最大个数 long keepAliveTime, // 超时多少就被销毁 TimeUnit unit,// 超时的单位 BlockingQueue<Runnable> workQueue,// 阻塞队列 ThreadFactory threadFactory,// 线程工厂 RejectedExecutionHandler handler// 拒绝策略

四种拒绝策略

AbortPolicy:队列满了,不处理,会抛出异常 CallerRunsPolicy:队列满了,哪来的回哪去,main线程调用的那就main处理 DiscardPolicy:队列满了,丢掉任务,不会抛出异常 DiscardOldestPolicy:队列满你了,会尝试和最早的线程竞争,如果失败了,也会丢掉任务,不会抛出异常

CPU密集型和IO密集型 一个计算为主的程序(专业一点称为CPU密集型程序)。多线程跑的时候,可以充分利用起所有的cpu核心,比如说4个核心的cpu,开4个线程的时候,可以同时跑4个线程的运算任务,此时是最大效率。 如果是一个磁盘或网络为主的程序(IO密集型)。一个线程处在IO等待的时候,另一个线程还可以在CPU里面跑,有时候CPU闲着没事干,所有的线程都在等着IO,这时候他们就是同时的了,而单线程的话此时还是在一个一个等待的。我们都知道IO的速度比起CPU来是慢到令人发指的。所以开多线程,比方说多线程网络传输,多线程往不同的目录写文件,等等。此时线程大于io数最好。

最新回复(0)