首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >线程池

线程池

作者头像
happyJared
发布2019-07-10 17:25:56
发布2019-07-10 17:25:56
1.1K0
举报
文章被收录于专栏:happyJaredhappyJared
  1. 为什么要用线程池?
  • 降低资源消耗。通过重复利用已创建的线程降低创建和销毁造成的消耗;
  • 提高响应速度。当任务到达时,无须等待线程创建完成就能立即执行任务;
  • 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的资源分配,调优和监控。
  1. 实现 Runnable 接口和 Callable 接口的区别?

如果要让线程池执行任务,需要实现的 Runnable 接口或 Callable 接口。Runnable 接口或 Callable 接口的实现类都可以被 ThreadPoolExecutor 或 ScheduledThreadPoolExecutor 执行,两者的区别在于 Runnable 接口不会返回执行结果,但 Callable 接口可以返回。

工具类 Executors 可以实现 Runnable 对象转换成 Callable 对象。(Executors.callable(Runnable task)Executors.callable(Runnable task, T result))。

  1. 执行 execute() 方法和 submit() 方法的区别是什么?
  2. execute() 方法用于提交不需要返回值的任务,所以无法判断任务是否被线程池成功执行与否;
  3. submit() 方法用于提交需要返回值的任务。线程池会返回一个 Future 类型的对象,通过这个 Future 对象,可以判断任务是否执行成功,并且可以通过 Future 的 get() 方法来获取返回值,get() 方法会阻塞当前线程直到任务完成,而使用 get(long timeout,TimeUnit unit) 方法,则会阻塞当前线程一段时间后立即返回,这时候有可能任务还没有执行完。
  4. 如何创建线程池

《阿里巴巴Java开发手册》中,强制线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式更加明确线程池的运行规则,规避资源耗尽的风险。

Executors 返回线程池对象的弊端如下:

  • FixedThreadPool 和 SingleThreadExecutor : 允许请求的队列长度为 Integer.MAX_VALUE ,可能堆积大量的请求,从而导致 OOM
  • CachedThreadPool 和 ScheduledThreadPool : 允许创建的线程数量为 Integer.MAX_VALUE ,可能会创建大量线程,从而导致 OOM

方式一:通过构造方法实现

ThreadPoolExecutor 构造方法

方式二:通过 Executor 框架的工具类 Executors 来实现,可以创建三种类型的 ThreadPoolExecutor:

  • FixedThreadPool : 该方法返回一个固定线程数量的线程池,线程池中的线程数量始终保持不变。当有一个新的任务提交时,线程池中若有空闲线程,则立即执行;若没有,则新的任务会被暂存在一个任务队列中,待有线程空闲时,便处理在任务队列中的任务;
  • SingleThreadExecutor:此方法返回只有单个线程的线程池。若有新的任务被提交到该线程池,则任务会被保存在一个任务队列中,待线程空闲时,按先入先出的顺序执行队列中的任务;
  • CachedThreadPool:该方法返回一个可根据实际情况调整线程数量的线程池。线程池的线程数量不确定,但若有空闲线程可以复用,则会优先使用可复用的线程;若所有线程均在工作,又有新的任务提交,则会创建新的线程处理任务。所有线程在当前任务执行完毕后,将返回线程池进行复用。

对应 Executors 工具类中的方法如图所示:

Executor 框架的工具类

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.07.09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档