网管 发布的文章

线程池异常怎么处理知道吗?在使用线程池处理任务时,任务代码可能会抛出 RuntimeException 异常。当异常被抛出后,线程池可能会捕获该异常并处理,或者创建一个新的线程来代替发生异常的线程。由于我们无法直接感知到任务是否出现异常,因此需要考虑线程池中的异常情况。

- 阅读剩余部分 -

线程池的线程数应该怎么配置?

线程在Java中属于稀缺资源,线程池不是越大越好也不是越小越好。任务分为计算密集型、IO密集型、混合型。

  1. 计算密集型:大部分都在用CPU跟内存,加密,逻辑操作业务处理等。
  2. IO密集型:数据库链接,网络通讯传输等。

javathread-70.png

一般的经验,不同类型线程池的参数配置:

  1. 计算密集型一般推荐线程池不要过大,一般是CPU数 + 1,+1是因为可能存在页缺失(就是可能存在有些数据在硬盘中需要多来一个线程将数据读入内存)。如果线程池数太大,可能会频繁的 进行线程上下文切换跟任务调度。获得当前CPU核心数代码如下:
Runtime.getRuntime().availableProcessors();
  1. IO密集型:线程数适当大一点,机器的Cpu核心数*2。
  2. 混合型:可以考虑根绝情况将它拆分成CPU密集型和IO密集型任务,如果执行时间相差不大,拆分可以提升吞吐量,反之没有必要。

当然,实际应用中没有固定的公式,需要结合测试和监控来进行调整。

线程池提交execute和submit有什么区别?execute 用于提交不需要返回值的任务threadsPool.execute(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } });submit()方法用于提交需要返回值的任务。线程池会返回一个future类型的对象,通过这个 future对象可以判断任务是否执行成功,并且可以通过future的get()方法来获取返回值

- 阅读剩余部分 -