设为首页 - 加入收藏 1818新闻网 (http://www.1818xinwen.com)- 国内知名站长资讯网站,提供最新最全的站长资讯,创业经验,网站建设等!
热搜: 数据 wifi javascript 发布
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

Java线程池的四种用法与使用场景

发布时间:2019-10-30 14:08 所属栏目:[优化] 来源:小涛
导读:一、如下方式存在的问题 newThread(){ @Override publicvoidrun(){ //业务逻辑 } }.start(); 1、首先频繁的创建、销毁对象是一个很消耗性能的事情;2、如果用户量比较大,导致占用过多的资源,可能会导致我们的服务由于资源不足而宕机;3、综上所述,在实际

Java线程池的四种用法与使用场景

?一、如下方式存在的问题

  1. new?Thread()?{?
  2. ????@Override?
  3. ????public?void?run()?{?
  4. ????????//?业务逻辑?
  5. ????}?
  6. }.start();?

1、首先频繁的创建、销毁对象是一个很消耗性能的事情;2、如果用户量比较大,导致占用过多的资源,可能会导致我们的服务由于资源不足而宕机;3、综上所述,在实际的开发中,这种操作其实是不可取的一种方式。

二、使用线程池有什么优点

1、线程池中线程的使用率提升,减少对象的创建、销毁;2、线程池可以控制线程数,有效的提升服务器的使用资源,避免由于资源不足而发生宕机等问题;

三、线程池的四种使用方式

1、newCachedThreadPool

创建一个线程池,如果线程池中的线程数量过大,它可以有效的回收多余的线程,如果线程数不足,那么它可以创建新的线程。

  1. public?static?void?method()?throws?Exception?{?
  2. ?
  3. ????ExecutorService?executor?=?Executors.newCachedThreadPool();?
  4. ?
  5. ????for?(int?i?=?0;?i?
  6. ?
  7. ????????final?int?index?=?i;?
  8. ?
  9. ????????Thread.sleep(1000);?
  10. ?
  11. ????????executor.execute(new?Runnable()?{?
  12. ????????????@Override?
  13. ????????????public?void?run()?{?
  14. ????????????????System.out.println(Thread.currentThread().getName()?+?"??"?+?index);?
  15. ????????????}?
  16. ????????});?
  17. ????}?
  18. }?

执行结果

Java线程池的四种用法与使用场景

通过分析我看可以看到,至始至终都由一个线程执行,实现了线程的复用,并没有创建多余的线程。如果当我们的业务需要一定的时间进行处理,那么将会出现什么结果。我们来模拟一下。

Java线程池的四种用法与使用场景

可以明显的看出,现在就需要几条线程来交替执行。

不足:这种方式虽然可以根据业务场景自动的扩展线程数来处理我们的业务,但是最多需要多少个线程同时处理缺是我们无法控制的;

优点:如果当第二个任务开始,第一个任务已经执行结束,那么第二个任务会复用第一个任务创建的线程,并不会重新创建新的线程,提高了线程的复用率;

2、newFixedThreadPool

这种方式可以指定线程池中的线程数。举个栗子,如果一间澡堂子最大只能容纳20个人同时洗澡,那么后面来的人只能在外面排队等待。如果硬往里冲,那么只会出现一种情景,摩擦摩擦...

首先测试一下最大容量为一个线程,那么会不会是我们预测的结果。

  1. public?static?void?method_01()?throws?InterruptedException?{?
  2. ?
  3. ????ExecutorService?executor?=?Executors.newFixedThreadPool(1);?
  4. ?
  5. ????for?(int?i?=?0;?i?
  6. ?
  7. ????????Thread.sleep(1000);?
  8. ????????final?int?index?=?i;?
  9. ?
  10. ????????executor.execute(()?->?{?
  11. ????????????try?{?
  12. ????????????????Thread.sleep(2?*?1000);?
  13. ????????????}?catch?(InterruptedException?e)?{?
  14. ????????????????e.printStackTrace();?
  15. ????????????}?
  16. ????????????System.out.println(Thread.currentThread().getName()?+?"??"?+?index);?
  17. ????????});?
  18. ????}?
  19. ????executor.shutdown();?
  20. }?

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

网友评论
推荐文章