前言
线程池在我们日常开发中扮演着重要的角色。
- 管理线程的创建和销毁,不需要开发者关系如何运作
keepAliveTime
: 为了释放多余的线程资源。非核心线程,空闲时有一个最长等待时间,就是keepAliveTime,时间到了没有任务,会被终止。
优点:
- 可以重用线程,避免线程创建的开销
- 任务过多时,通过排队避免创建过多线程,减少系统资源消耗
sleep()与yield()
- sleep()
不会事线程丢失监视器所有权,当前线程仍然占用CPU分片。
可读性更好的写法:
TimeUnit.SECONDS.sleep(1);
- yield() 让步 线程让步。 对线程调度器发出一个暗示,当前线程愿意让出使用的处理器。 调用次方法后,状态可能由running状态转为runnable状态。
- join() 表示无限等待,一直阻塞当前线程,知道目标线程执行完毕。 通常是加入的意思,一个线程要加入到另外一个线程,最好是等着它一起走。
守护线程(Daemon)
- 相当于闭馆后最后一个锁大门的管理者
注意
线程池中,核心线程和最大线程是否有特殊标记?
没有,无论是核心线程还是非核心线程,在线程池中都一样,当淘汰的时候,不关心是哪些线程,只需要留下核心线程数量个线程即可。
线程数小于核心线程数,并且线程都处于空闲状态,现在提交一个任务,是新起一个线程还是给之前创建的线程运行?
execute方法的注释中写道,
If fewer than corePoolSize threads are running, try to start a new thread with the given command as its first task
. 从注释可以知道,此时线程池会新起一个线程来运行新任务,不管老线程是否空闲。