龙空技术网

一文读懂Java线程池工作原理

孙工精品 183

前言:

当前我们对“java线程池shutdownnow”大体比较珍视,我们都想要剖析一些“java线程池shutdownnow”的相关内容。那么小编同时在网上搜集了一些关于“java线程池shutdownnow””的相关知识,希望看官们能喜欢,大家一起来学习一下吧!

一、线程池创建方式二、线程池创建参数

int corePoolSize,线程中的核心线程数,创建线程池时不会启动线程 prestartAllCoreThreads()方法就会启动核心数的线程

int maximumPoolSize, 运行的最大线程数

long keepAliveTime,线程空闲下来后,存活时间。线程数大于 corePoolSize才会有用

TimeUnit unit,存活时间的单位

BlockingQueue workQueue,保存任务的阻塞队列

ThreadFactory threadFactory, 创建线程的工厂,给新线程赋予名字

RejectedExecutionHandler handler,最大线程数和阻塞队列都满了, 饱和策略,

三、线程饱和策略

AbortPolicy:直接抛出异常

CallerRunsPolicy:用调用者所在的线程来执行任务

DiscardOldestPolicy:丢弃阻塞队列里最老的任务

DiscardPolicy:当前任务直接丢弃,不抛异常

自定义实现RejectedExecutionHandler

四、线程池的工作过程

线程池刚创建时,里面没有一个线程。任务队列是作为参数传进来的。不过,就算队列里面有任务,线程池也不会马上执行它们。当一个线程无事可做,超过一定的时间(keepAliveTime)时,线程池会判断,如果当前运行的线程数大于 corePoolSize,那么这个线程就被停掉。所以线程池的所有任务完成后,它最终会收缩到 corePoolSize 的大小。并不是先加入任务就一定会先执行。假设队列大小为 10,corePoolSize 为 3,maximumPoolSize 为 6,那么当加入 20 个任务时,执行的顺序就是这样的:首先执行任务 1、2、3,然后任务 4~13 被放入队列。这时候队列满了,任务 14、15、16 会被马上执行,而任务 17~20 则会抛出异常。最终顺序是:1、2、3、14、15、16、4、5、6、7、8、9、10、11、12、13。

五、任务提交返回无返回任务提交 execute带返回任务提交 submit六、5、关闭线程池shutdown() 设置线程池状态,只会中断所有没有执行任务的线程shutdownNow() 设置线程池状态,还会尝试停止正在运行或者暂停任务的线程七、线程池合理配置计算密集型:加密,大数分解,正则 。线程数适量小一点,最大推荐:机器的CPU核心数+1 Runtime.getRuntime().availableProcessors() 获取机器的CPU核心数,为啥加1:页缺失,当前线程需要执行的线程的数据全部加装到内存中了,可能当前的线程需要的数据在磁盘上,操作系统需要将磁盘的数据调度的内存中,当前线程会被挂起IO密集型:读取文件,数据库连接,网络通讯。线程数适当大一点,建议:机器的CPU核心数*2混合型八、系统预定义的线程池

工具类 :

ExecutorService newSingleThreadExecutor() // 创建单个线程池。线程池中只有一个线程ExecutorService newFixedThreadPool() // 创建固定大小的线程池ExecutorService newCachedThreadPool() // 缓存线程池,线程池的数量不固定,可以根据需求自动的更改数量。ScheduledExecutorService newScheduledThreadPool()// 创建固定大小的线程,可以延迟或定时的执行任务。WorkStealingPool // 基于ForkJoinPool实现

标签: #java线程池shutdownnow