threadpool

前言: 关于线程池的一些使用和细节。

线程池在我们日常开发中扮演着重要的角色。

  • 管理线程的创建和销毁

keepAliveTime: 为了释放多余的线程资源。非核心线程,空闲时有一个最长等待时间,就是keepAliveTime,时间到了没有任务,会被终止。

优点:

  1. 可以重用线程,避免线程创建的开销
  2. 任务过多时,通过排队避免创建过多线程,减少系统资源消耗

注意

  1. 线程池中,核心线程和最大线程是否有特殊标记?

    没有,无论是核心线程还是非核心线程,在线程池中都一样,当淘汰的时候,不关心是哪些线程,只需要留下核心线程数量个线程即可。

  2. 线程数小于核心线程数,并且线程都处于空闲状态,现在提交一个任务,是新起一个线程还是给之前创建的线程运行?
    execute方法的注释中写道,If fewer than corePoolSize threads are running, try to start a new thread with the given command as its first task. 从注释可以知道,此时线程池会新起一个线程来运行新任务,不管老线程是否空闲。

sleep()与yield()

  1. sleep()
    不会事线程丢失监视器所有权,当前线程仍然占用CPU分片。
    可读性更好的写法:
    1
    TimeUnit.SECONDS.sleep(1);
  2. yield() 让步
    线程让步。
    对线程调度器发出一个暗示,当前线程愿意让出使用的处理器。
    调用次方法后,状态可能由running状态转为runnable状态。
  3. join()
    表示无限等待,一直阻塞当前线程,知道目标线程执行完毕。
    通常是加入的意思,一个线程要加入到另外一个线程,最好是等着它一起走。

守护线程(Daemon)