当前位置: 首页 > news >正文

设计商城网站 优帮云设计公司的网站详情

设计商城网站 优帮云,设计公司的网站详情,wordpress维基模板,网上建站赚钱目录 #x1f6a9;什么是线程池 #x1f388;从池子中取效率大于新创建线程效率(why) #x1f6a9;标准库中的线程池 #x1f388;为什么调用方法而不是直接创建对象 #x1f388;工厂类里的方法 #x1f4dd;newCachedThreadPool() #x1f4dd;newFixedThread…目录 什么是线程池 从池子中取效率大于新创建线程效率(why) 标准库中的线程池 为什么调用方法而不是直接创建对象  工厂类里的方法 newCachedThreadPool() newFixedThreadPool()  实现线程池 ThreadPoolExecutor ThreadPoolExecutor的构造器参数 ThreadPoolExecutor的新任务拒绝策略 什么是线程池 首先我们想象一个场景就是比较渣的场景我是一个男生很帅并且有才华追问的人呢很多排成了一个长队。然后我就挑了一个既好看又有钱又有才华的女生进行交往交往一段时候后我腻歪了想换个女朋友此时我要做俩个事情1想办法分手2再找一个小哥哥培养感情。此时进行这俩个操作的时候效率是很低的有没有办法优化呢 优化我和这个女生A再交往的过程中同时再和另一个女生B搞暧昧(培养感情当我想和女生A分手的时候就只要分手了后我们就可以和女生B直接在一起了。(此时我和女生B感情是有一定的基础了。此时女生B就是我们所说的备胎。 进一步优化我需要更高的效率的话更换女朋友就可以再和女生A在一起的时候同时和女生B,C,D交往联络感情此时女生B,C,D都是我的备胎此时备胎就构成了——备胎池。 所以和线程池有同样的方式线程池顾名思义就是存放线程的池子等需要了就直接调用了省去了启动和销毁的损耗了。 线程池最大的好处就是减少每次启动、销毁线程的损耗 从上面线程池我们知道等需要了就直接从线程池中取但是为什么从池子取得效率比新创建线程得效率更高呢 从池子中取效率大于新创建线程效率(why) 从池子中取这个动作是纯粹用户态得操作创建新的线程这个动作是需要用户态内核态相互配合完成的操作。 如果一段程序是在系统内核中执行此时就称为内核态,如果不是则称为用户态. 操作系统是由 内核配套 的应用程序构成的内核则是 系统最核心的部分创建线程操作就需要调用系统api进入内核中按照内核态的方式来完成一系列操作。 场景 滑稽老哥去银行存钱但是需要身份证复印件但是滑稽老哥没有所以滑稽老哥就有俩个选择。 A银行柜员说你可以给身份证给我我去帮你打印 B银行柜员又说 大厅的角落有一个自助复印机你可以自行去复印。 A这个过程就是涉及到了内核态操作了所谓内核态就是柜员要进行的操作此时你交给柜员后柜员会在给你复印件之前会做哪些工作因为操作系统内核是给所有的进程提供服务的当你要创建线程的时候人家内核会帮你做但是做的过程难免会做一些其他的事情——不可控 B这个过程就是纯粹用户态的操作所谓用户态就是用户自己要进行的操作滑稽老哥就可以立即去复印复印完了之后就立即回来整个过程中没有任何拖泥带水的。——可控 标准库中的线程池 使用 Executors.newFixedThreadPool(10) 能创建出固定包含 10 个线程的线程池. 返回值类型为 ExecutorService 线程池对象不是直接创建出来的而是通过一个专门的方法返回一个线程池对象。 ExecutorService service Executors.newCachedThreadPool(); 通过 ExecutorService.submit 可以注册一个任务到线程池中 Executors.newCachedThreadPool();其实是个工厂模式(设计模式)也就是Executors是个工厂类需要创建线程但是为什么调用方法呢而不是直接创建线程池对象呢? 为什么调用方法而不是直接创建对象  创建对象的同时new关键字就会触发类的构造方法但是构造方法存在一定的局限性。 考虑有个类我们期待用笛卡尔坐标系来构造对象又或者用极坐标构造对象写在一起的时候这俩个方法是无法重载的也就是说在一个类中我们要实现不同方式的初始化就会编译失败。其实很多时候构造一个对象希望有多种构造方式多种方式就需要使用多个版本的构造方法来分别实现但是构造方法要求方法的名字必须是类名不同的构造方法就只能通过 重载 的方式区分了。重载是方法名相同参数个数类型不同使用工厂模式/设计模式就能解决这个问题使用普通的方法代替构造方法来完成初始化工作普通方法就可以通过方法名的不同来进行区分了不必因为重载的规则而限制了。 通过这种我们通过一个工厂类Executors调用方法创建不同类型的初始化工作。Executors是工厂类那么调用的方法是工厂方法然后加工好之后返回的是整个加工好的线程而ExecutorService就是线程池是由工厂类调用工厂方法创建好的。 实践中一般单独搞一个类给这个类搞一些静态方法由这样静态方法负责构造出对象 class PointFactory{public static Point makePointByXY(int x,int y){};public static Point makePointByRA(int R,int A){}; 等到需要调用哪个的时候我们就可以通过类来调用方法。 工厂类里的方法 Executors 创建线程池的几种方式 newFixedThreadPool: 创建固定线程数的线程池 newCachedThreadPool: 创建线程数目动态增长的线程池. newSingleThreadExecutor: 创建只包含单个线程的线程池. newScheduledThreadPool: 设定 延迟时间后执行命令或者定期执行命令. 是进阶版的 Timer. Executors 本质上是 ThreadPoolExecutor 类的封装. newCachedThreadPool() ExecutorService service Executors.newCachedThreadPool(); newCachedThreadPool()方法中cached缓存用过之后不着急释放先留着以备下次使用此时构造出的线程池对象有一个基本特点线程数目是能够动态适应的随着往线程池中添加任务这个线程池中的线程会根据需要自动被创建出来创建出来之后也不会着急销毁会在池子里保留一定的时间以备随时再使用。 newFixedThreadPool()  ExecutorService service1Executors.newFixedThreadPool(4); 固定的指定创建几个线程。具体需要创建几个线程正确做法就是使用实验的方式对程序进行性能测试测试过程中尝试修改不同的线程池的线程数目看哪种情况下最符合你的要求。  还有些工厂方法了解即可。 实现线程池 核心操作为 submit, 将任务加入线程池中 使用 MyThread 类描述一个工作线程. 使用 Runnable 描述一个任务. 使用一个 BlockingQueue 组织所有的任务 每个 t 线程要做的事情: 不停的从 BlockingQueue 中取任务并执行. package ThreadPool;import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue;class MyThread{BlockingQueueRunnable queuenew ArrayBlockingQueueRunnable(1000);public void submit(Runnable runnable){queue.offer(runnable);}public void takeTask(int n){for (int i 0; i n; i) {Thread tnew Thread(()-{try {Runnable runnablequeue.take();runnable.run();} catch (InterruptedException e) {throw new RuntimeException(e);}});t.start();}} } public class ThreadPool_test {public static void main(String[] args) {MyThread myThreadnew MyThread();for (int i 0; i 100; i) {//一百个任务myThread.submit(new Runnable() {Overridepublic void run() {System.out.println(我爱zyf);}});}myThread.takeTask(10);//10个线程执行100个任务} } 打印了十个10个线程执行了10个任务因为里面没有用while(true)循环一个线程执行完任务之后就结束了。但是这些线程是可能同时执行各自的任务但是一个线程肯定是执行一个任务。 ThreadPoolExecutor 在阿里巴巴手册中有一条建议 【强制】线程池不允许使用 Executors 去创建而是通过ThreadPoolExecutor的方式这样的处理方式让写的同学更加明确线程池的运行规则规避资源耗尽的风险。 如果经常基于Executors提供的工厂方法创建线程池很容易忽略线程池内部的实现。特别是拒绝策略因使用Executors创建线程池时不会传入这个参数直接采用默认值所以常常被忽略。 ThreadPoolExecutor可以实现线程池的创建。ThreadPoolExecutor相关类图如下 从类图可以看出ThreadPoolExecutor最终实现了Executor接口是线程池创建的真正实现者。 ThreadPoolExecutor核心方法有俩个一个是构造方法一个是注册任务(添加方法). ThreadPoolExecutor的构造器参数 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueueRunnable workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) 参数一指定线程池的线程数量核心线程 corePoolSize不能小于0参数二指定线程池可支持的最大线程数 maximumPoolSize最大数量 核心线程数量参数三指定临时线程的最大存活时间 keepAliveTime不能小于0则表示实习生可以摸鱼的时间并不代表一摸鱼就被开除了参数四指定存活时间的单位(秒、分、时、天) unit时间单位参数五指定任务队列 workQueue不能为null参数六指定用哪个线程工厂创建线程 threadFactory不能为null参数七指定线程忙任务满的时候新任务来了怎么办 handler不能为null临时线程触发机制新任务提交时发现核心线程都被占用任务队列也满了但还可以创建临时线程此时才会创建临时线程。何时拒绝任务核心线程和临时线程都在忙任务队列也满了新的任务过来的时候才会开始任务拒绝。 “核心线程”如何理解呢 如果把一个线程池理解成一个公司此时公司里有俩类员工一批是正式员工(有编制的),另一批是实习生(无编制的),正式员工的数目就是核心线程数最大线程数就是正式员工实习生。这个线程池里线程的数目是可以动态变化的变化的范围就是[corePoolSize,maxmumPoolSize],正式员工可以摸鱼不会因为摸鱼被公司开除但是实习生不允许摸鱼如果这段时间任务多了就可以多搞几个实习生来干活如果过段时间任务少了并且少的状态持续了一段时间空闲的实习生就被裁掉了。这样做既可以满足效率的要求又可以避免过多的系统开销 BlockingQueueRunnable workQueue 阻塞队列用来存放线程池中的任务的可以根据需要灵活设置这里的队列是啥需要优先级就可以设置PriorityBlockingQueue,如果不需要优先级并且任务数目是相对恒定的可以使用ArrayBlockingQueue,如果不需要优先级并且任务数目变动较大就用LinkedBlockingQueue。 ThreadFactory   工厂模式的体现此处使用ThreadFactory作为工厂类由这个类负责创建线程使用工厂类创建线程主要是为了再创建过程中对线程的属性做出一些设置。(如果手动创建线程就得手动设置在这些属性就比较麻烦使用工厂方法封装一下 RejectedExecutionHandler  线程池的拒绝策略一个线程池能容纳的任务数量是有上限的当持续往线程池里添加任务的时候一旦已经达到上限了继续添加会出现什么效果呢不同的拒绝策略就有不同的效果 ThreadPoolExecutor的新任务拒绝策略 就比如一个学校老师一个星期得上8节课学校领导找到我想让我去参加校园活动。 1.听到这个要求的时候老师心态崩了心情很烦躁——这属于.AbortPolicy直接抛出异常)2.老师直接和领导说她这边有好多课去不了让领导一个人去参加校园活动(.CallerRunsPolicy拒绝新任务由新增任务的线程去执行3.老师给这一周8节课中一节课给割了然后和领导一起去参加校园活动.DiscardOldestPolicy丢弃任务队列中最老的任务,执行新任务去4.老师拒绝了校领导继续去上课然后校领导也不去了这个校园活动都不去参加了。DisCardPolicy丢弃新加的任务新加任务的线程也丢弃了) 在面试中拒绝策略和线程数目是面试的重点。 保持现状。
http://www.zqtcl.cn/news/289682/

相关文章:

  • 免费网站建设是什么宁波网站建设的价格表
  • 网站设计导航栏高度网站设计的经营范围
  • 帮别人建设网站多少利润北京网站建设公司华网制作作
  • 微信网站需要备案吗瑞安商业网站建设
  • 做网站如何计算工资wordpress stheme
  • 网站建设销售人才简历wordpress 搜索tag
  • 设计网站专业云南旅行社网站开发
  • 小规模开普票网站建设几个点张浦专业做网站
  • 点击图片跳转到网站怎么做链接网址后缀名大全
  • php网站开发优化crm客户系统
  • 韩国网站免费模板wordpress数据库名称
  • 如何修改网站发布时间贵阳网站建设报价
  • 东莞网站推广培训免费云电脑
  • 湖北网站建设详细方案脑叶公司手机版下载
  • 淄博网站制作平台形象怎样建设旅游网站
  • 广州花都网站建设网站改版协议
  • 中国建设协会网站首页工信部网站备案被删除
  • 丹阳网站建设案例dedecms 购物网站
  • 网站上怎么做动画广告视频下载seo黑帽是什么意思
  • 服装网站建设网综合社区网站开发费用
  • 做网站预付款 怎么做账做律师网站的网络公司
  • 购物网站开发模板小程序注册拉新
  • 怎么建立一个网站能够与讯飞云对话罗湖附近公司做网站建设哪家好
  • 唐山网站制作公司北京网站开发优选ls20227
  • php 网站备份代码广州网站设计公司招聘
  • 做ppt的网站兼职上海未来网站建设公司
  • 某某公司网站建设论文wordpress 企业 主题
  • 网站提示域名解析错误怎么办百度网址提交
  • 福建省住房城乡建设部网站车公庙网站建设
  • 长沙网站seo诊断ip138禁止查询该域名