线程池 01

为什么使用线程池

管理多个线程,让其并发或者排队。
减少新创建线程的时间空间开销。
如果线程池空闲时,减少任务新创建线程的开销,即来即用。

风险

同步错误

  • 死锁
    2个线程互相持有需要的锁
  • 资源不足
    如果有很多线程,环境切换也可能严重地影响程序的性能。
    除了线程自身所使用的资源以外,服务请求时所做的工作可能需要其它资源,例如 JDBC 连接、套接字或文件。这些也都是有限资源,有太多的并发请求也可能引起失效,例如不能分配 JDBC 连接。
  • 并发错误
    线程池和其它排队机制依靠使用 wait() 和 notify() 方法,这两个方法都难于使用。如果编码不正确,那么可能丢失通知,导致线程保持空闲状态,尽管队列中有工作要处理。使用这些方法时,必须格外小心。而最好使用现有的、已经知道能工作的实现,例如 util.concurrent 包。
  • 线程泄漏
    线程发生 error,抛出 RuntimeException 或一个 Error 时。如果池类没有捕捉到它们,那么线程只会退出而线程池的大小将会永久减少一个。直到线程池为空。

使用准则

  • 尽量不要对那些同步等待其它任务结果的任务排队。防止死锁。
  • 时间可能很长的操作使用合用的线程时要小心。
    如果程序必须等待诸如 I/O 完成这样的某个资源,那么请指定最长的等待时间,以及随后是失效还是将任务重新排队以便稍后执行。
    这样做保证了:通过将某个线程释放给某个可能成功完成的任务,从而将最终取得某些进展。
    ???? 指定等待时间?
  • 理解任务。 线程池大小。
    正在排队任务的任务正在做什么?
    瓶颈是CPU 限制的吗?还是 I/O?
    您的答案将影响您如何调整应用程序。如果您有不同的任务类,这些类有着截然不同的特征,那么为不同任务类设置多个工作队列可能会有意义,这样可以相应地调整每个池。

线程池大小设置

避免:线程 太少 或 太多。

  • 线程池的最佳大小取决于可用处理器的数目以及工作队列中的任务的性质。
    若在一个具有 N 个处理器的系统上只有一个工作队列,其中全部是计算性质的任务,在线程池具有 N 或 N+1 个线程时一般会获得最大的 CPU 利用率。

  • 对于那些可能需要等待 I/O 完成的任务(例如,从套接字读取 HTTP 请求的任务),需要让池的大小超过可用处理器的数目,因为并不是所有线程都一直在工作。通过使用概要分析,您可以估计某个典型请求的等待时间(WT)与服务时间(ST)之间的比例。如果我们将这一比例称之为 WT/ST,那么对于一个具有 N 个处理器的系统,需要设置大约 N*(1+WT/ST) 个线程来保持处理器得到充分利用。

一般说来,大家认为线程池的大小经验值应该这样设置:(其中N为CPU的核数)
如果是CPU密集型应用,则线程池大小设置为N+1
如果是IO密集型应用,则线程池大小设置为2N+1

结论:设置 N +1 个线程
服务器端 与 移动端

//参数初始化
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();

常用的几种线程池

newCachedThreadPool

一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

  • 线程池为无限大(其实也有限制的,数目为Interger. MAX_VALUE),当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。
  • 如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为1分钟),则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程。
  • 在使用CachedThreadPool时,一定要注意控制任务的数量,否则,由于大量线程同时运行,很有会造成系统瘫痪。

newFixedThreadPool

指定工作线程数量的线程池。
如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。
优点:
它具有线程池提高程序效率和节省创建线程时所耗的开销的优点。
缺点:
在线程池空闲时,即线程池中没有可运行任务时,它不会释放工作线程,还会占用一定的系统资源。

newSingleThreadExecutor

创建唯一的工作者线程来执行任务。
它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
如果这个线程异常结束,会有另一个取代它,保证顺序执行。

newScheduleThreadPool

创建一个定长的线程池,而且支持定时的以及周期性的任务执行,支持定时及周期性任务执行。

参考文章

https://www.cnblogs.com/aaron911/p/6213808.html
https://www.cnblogs.com/zhujiabin/p/5404771.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值