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