Java 并发-newFixedThreadPool

打印 上一主题 下一主题

主题 1766|帖子 1766|积分 5298

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
前言

为什么选择利用多线程?一种场景是在数据和业务处理惩罚能力出现瓶颈时,而服务器性能又有空闲,通常是cpu空闲,这时利用多线程就能很好的办理问题,而又无需加硬件,实际利用中,线程池又是最为常用的一种,本文介绍了newFixedThreadPool的利用方法
原理

newFixedThreadPool内部有一种壅闭队列,是一个无界的LinkedBlockingQueue,使命放在队列中,线程由线程池初始化创建好,如果有空闲线程,那么就调用去处理惩罚队列中的使命,没有就排队
必要注意的是这个队列可能会变得很大,要注意线程池的处理惩罚能力,制止排队使命太多造成内存溢出,其最大值是Integer的上限,不外由于是链表,也可以无限延伸,或者可以在参数中显式创建有界壅闭队列,制止这个问题
实际利用

  1. ExecutorService executor = Executors.newFixedThreadPool(num);
复制代码
创建线程池,这里num是线程数量
然后这里做了一个循环模仿运行线程,注意最后要关闭线程池
  1.   for (int i = 0; i < 10; i++) {
  2.             executorService.execute(new Task(i));
  3.         }
  4.         executorService.shutdown();
  5.         
  6. class Task implements Runnable {
  7.     private int id;
  8.     public Task(int id) {
  9.         this.id = id;
  10.     }
  11.     public void run() {
  12.         System.out.println("Task " + id + " is running...");
  13.     }      
复制代码
这种方法是execute方式,也可以利用submit方式,这两种方式区别在于
1,可以用Future对象获取submit的效果
2,execute()方法只能接受Runnable类型的使命,而submit()方法既可以接受Runnable类型的使命,也可以接受Callable类型的使命。
3,execute()方法是一种异步提交方式,即提交使命后立刻返回,不会等候使命执行完成。而submit()方法是一种同步提交方式,即提交使命后会壅闭当火线程,直到使命执行完成。
4,而execute()方法没有提供取消使命的方法,submit()方法返回的Future对象可以用来取消使命
5,execute()方法中如果使命执行过程中发生了非常,则非常会被传递到使命提交的地方,并由使命提交的线程来处理惩罚。而submit()方法中,如果使命执行过程中发生了非常,非常将被封装在Future对象中,直到调用Future.get()方法时才会将非常抛出
优缺点

NFTP线程池优点在于利用简单,不必要手动的创建,管理,调理线程;同时由于线程数固定,不会出现超出导致系统瓦解,作为一个多线程的实现可以有效处理惩罚并发
缺点在于线程数固定,无法动态调解,同时暂存使命的壅闭队列长度无限拓展可能会造成内存耗尽,同时也无法控制使命时长,可能造成后续使命等候时间超长乃至失败,在笔者实际利用时,还发现这个线程池如果重复创建,可能会造成耗尽cpu资源,由于没有使命时长的控制,线程池执行过慢导致壅闭,这时即时手动interrupt依然会堆积线程,导致cpu执行过久无相应

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

温锦文欧普厨电及净水器总代理

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表