线程
线程和进程
进程是操作系统资源分配的基本单位
线程是处理器任务调度和执行的基本单位
线程池
UML

参数
corePoolSize 核心线程大小
maximumPoolSize 最大线程数量
workQueue 队列长度
线程池的两种提交任务方式区别
execute只能提交Runnable,无返回值
ThreadPoolExecutor.java
submit既可以提交Runnable,返回值null;也可以提交Callable,返回值Future
AbstractExecutorService.java
Callable是设置如何产生结果,Future用来获取结果
执行遇到异常
execute 会直接抛出,可以通过Thread::setUncaughtExceptionHandler来处理
submit 不会直接抛出,需要使用Future.get()回去返回值时才抛出。
Executors
类型
SingleThreadExecutor:单线程的线程池
FixedThreadPool:固定大小的线程池
CachedThreadPool:核心线程数为0,可以服用之前创建但现在空闲的线程的线程池
ScheduledThreadPool:支持定时及周期性执行任务的线程池
WorkingStealingPool:java1.8之后,自动调用系统可用的线程数,并行执行任务
弊端
FixedThreadPool
和SingleThreadPool
:允许请求的队列长度为Integer.MAX_VALUE,可能会堆积大量请求,导致oomCachedThreadPool
:允许创建的线程数量为Integer.MAX_VALUE,可能 创建大量线程,导致oom
ThreadPoolExecutor
execute方法
拒绝策略
RejectedExecutionHandler,任务处理不过来时,拒绝策略
new ThreadPoolExecutor.AbortPolicy()
直接抛异常
new ThreadPoolExecutor.CallerRunsPolicy()
线程池如果未关闭,直接执行run方法
new ThreadPoolExecutor.DiscardPolicy()
新任务直接丢弃
new ThreadPoolExecutor.DiscardOldestPolicy()
线程池等待任务移除队列头部元素(poll()方法),将新任务加到队列中
自定义策略,比如持久化多余的线程,用定时任务把持久化线程取出
Thread
sleep方法和wait方法区别
所属类和方法类型不同:Thread.sleep() ; new Object().wait()
使用语法不同:
sleep可以直接使用
wait方法需要先拿到锁,才可以调object.wait()
唤醒方式不同
sleep 需要指定时间
wait 可以传时间,也可以不传时间;或者使用notify() /notifyAll()
释放锁资源不同
sleep 休眠时不会释放锁资源
wait 休眠时会释放锁资源
线程状态不同
sleep: TIMED_WAITING
wait: WAITING