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

建立一个自己的网站有赞微商城app官方下载

建立一个自己的网站,有赞微商城app官方下载,阿里巴巴1688网页版,全屋定制品牌目录 一#xff1a;Java内置线程池原理剖析 二#xff1a;ThreadPoolExecutor参数详解 三#xff1a;线程池工作流程总结示意图 四#xff1a;自定义线程池-参数设计分析 1:核心线程数(corePoolSize) 2:任务队列长度(workQueue) 3:最大线程数(maximumPoolSize) 4:最…目录 一Java内置线程池原理剖析 二ThreadPoolExecutor参数详解 三线程池工作流程总结示意图 四自定义线程池-参数设计分析 1:核心线程数(corePoolSize) 2:任务队列长度(workQueue) 3:最大线程数(maximumPoolSize) 4:最大空闲时间(keepAliveTime) 五自定义线程池-实现步骤 1:编写任务类(MyTask),实现Runnable接口; 2:编写线程类(MyWorker),用于执行任务,需要持有所有任务; 3:编写线程池类(MyThreadPool),包含提交任务,执行任务的能力; 4:编写测试类(MyTest),创建线程池对象,提交多个任务测试; 一Java内置线程池原理剖析 我们要想自定义线程池,必须先了解线程池的工作原理,才能自己定义线程池这里我们通过观察java中ThreadPoolExecutor的源码来学习线程池的原理 构造方法: public ThreadPoolExecutor(int corePoolSize, //核心线程数量int maximumPoolSize,// 最大线程数long keepAliveTime, // 最大空闲时间TimeUnit unit, // 时间单位BlockingQueueRunnable workQueue, // 任务队列ThreadFactory threadFactory, // 线程工厂RejectedExecutionHandler handler // 饱和处理机制) { ... }二ThreadPoolExecutor参数详解 我们可以通过下面的场景理解ThreadPoolExecutor中的各个参数; a客户(任务)去银行(线程池)办理业务,但银行刚开始营业,窗口服务员还未就位(相当于线程池中初始线程数量为0), 于是经理(线程池管理者)就安排1号工作人员(创建1号线程执行任务)接待a客户(创建线程); 在a客户业务还没办完时,b客户(任务)又来了,于是经理(线程池管理者)就安排2号工作人员(创建2号线程执行任务)接待b客户(又创建了一个新的线程);假设该银行总共就2个窗口(核心线程数量是2); 紧接着在a,b客户都没有结束的情况下c客户来了,于是经理(线程池管理者)就安排c客户先坐到银行大厅的座位上(空位相当于是任务队列)等候, 并告知他: 如果1、2号工作人员空出,c就可以前去办理业务; 此时d客户又到了银行,(工作人员都在忙,大厅座位也满了)于是经理赶紧安排临时工(新创建的线程)在大堂站着,手持pad设备给d客户办理业务; 假如前面的业务都没有结束的时候e客户又来了,此时正式工作人员都上了,临时工也上了,座位也满了(临时工加正式员工的总数量就是最大线程数), 于是经理只能按《超出银行最大接待能力处理办法》(饱和处理机制)拒接接待e客户; 最后,进来办业务的人少了,大厅的临时工空闲时间也超过了1个小时(最大空闲时间),经理就会让这部分空闲的员工人下班.(销毁线程) 但是为了保证银行银行正常工作(有一个allowCoreThreadTimeout变量控制是否允许销毁核心线程,默认false),即使正式工闲着,也不得提前下班,所以1、2号工作人员继续待着(池内保持核心线程数量); 三线程池工作流程总结示意图 四自定义线程池-参数设计分析 通过观察 Java 中的内置线程池参数讲解和线程池工作流程总结 , 我们不难发现 , 要设计一个好的线程池 , 就必须合理的设置线程池的 4 个参数 ; 那到底该如何合理的设计 4 个参数的值呢 ? 我们一起往下看 . 4 个参数的设计 : 1:核心线程数(corePoolSize) 核心线程数的设计需要依据任务的处理时间和每秒产生的任务数量来确定,例如:执行一个任务需要0.1秒,系统百分之80的时间每秒都会产生100个任务,那么要想在1秒内处理完这100个任务,就需要10个线程,此时我们就可以设计核心线程数为10;当然实际情况不可能这么平均,所以我们一般按照8020原则设计即可,既按照百分之80的情况设计核心线程数,剩下的百分之20可以利用最大线程数处理; 2:任务队列长度(workQueue) 任务队列长度一般设计为:核心线程数/单个任务执行时间*2即可;例如上面的场景中,核心线程数设计为10,单个任务执行时间为0.1秒,则队列长度可以设计为200; 3:最大线程数(maximumPoolSize) 最大线程数的设计除了需要参照核心线程数的条件外,还需要参照系统每秒产生的最大任务数决定:例如:上述环境中,如果系统每秒最大产生的任务是1000个,那么,最大线程数(最大任务数-任务队列长度)*单个任务执行时间;既: 最大线程数(1000-200)*0.180个; 4:最大空闲时间(keepAliveTime) 这个参数的设计完全参考系统运行环境和硬件压力设定,没有固定的参考值,用户可以根据经验和系统产生任务的时间间隔合理设置一个值即可; 上面4个参数的设置只是一般的设计原则,并不是固定的,用户也可以根据实际情况灵活调整! 五自定义线程池-实现步骤 1:编写任务类(MyTask),实现Runnable接口; /*需求:自定义线程池练习,这是任务类,需要实现Runnable;包含任务编号,每一个任务执行时间设计为0.2秒*/ public class MyTask implements Runnable{private int id;//由于run方法是重写接口中的方法,因此id这个属性初始化可以利用构造方法完成public MyTask(int id) {this.id id;}Overridepublic void run() {String name Thread.currentThread().getName();System.out.println(线程:name 即将执行任务:id);try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(线程:name 完成了任务:id);}Overridepublic String toString() {return MyTask{ id id };} } 2:编写线程类(MyWorker),用于执行任务,需要持有所有任务; /*需求:编写一个线程类,需要继承Thread类,设计一个属性,用于保存线程的名字;设计一个集合,用于保存所有的任务;*/ public class MyWorker extends Thread{private String name;//保存线程的名字private ListRunnable tasks;//利用构造方法,给成员变量赋值public MyWorker(String name, ListRunnable tasks) {super(name);this.tasks tasks;}Overridepublic void run() {//判断集合中是否有任务,只要有,就一直执行任务while (tasks.size()0){Runnable r tasks.remove(0);r.run();}} }3:编写线程池类(MyThreadPool),包含提交任务,执行任务的能力; /*这是自定义的线程池类;成员变量:1:任务队列 集合 需要控制线程安全问题2:当前线程数量3:核心线程数量4:最大线程数量5:任务队列的长度成员方法1:提交任务;将任务添加到集合中,需要判断是否超出了任务总长度2:执行任务;判断当前线程的数量,决定创建核心线程还是非核心线程*/ public class MyThreadPool {// 1:任务队列 集合 需要控制线程安全问题private ListRunnable tasks Collections.synchronizedList(new LinkedList());//2:当前线程数量private int num;//3:核心线程数量private int corePoolSize;//4:最大线程数量private int maxSize;//5:任务队列的长度private int workSize;public MyThreadPool(int corePoolSize, int maxSize, int workSize) {this.corePoolSize corePoolSize;this.maxSize maxSize;this.workSize workSize;}//1:提交任务;public void submit(Runnable r){//判断当前集合中任务的数量,是否超出了最大任务数量if(tasks.size()workSize){System.out.println(任务:r被丢弃了...);}else {tasks.add(r);//执行任务execTask(r);}}//2:执行任务;private void execTask(Runnable r) {//判断当前线程池中的线程总数量,是否超出了核心数,if(num corePoolSize){new MyWorker(核心线程:num,tasks).start();num;}else if(num maxSize){new MyWorker(非核心线程:num,tasks).start();num;}else {System.out.println(任务:r 被缓存了...);}}}4:编写测试类(MyTest),创建线程池对象,提交多个任务测试; /*测试类:1: 创建线程池类对象;2: 提交多个任务*/ public class MyTest {public static void main(String[] args) {//1:创建线程池类对象;MyThreadPool pool new MyThreadPool(2,4,20);//2: 提交多个任务for (int i 0; i 30 ; i) {//3:创建任务对象,并提交给线程池MyTask my new MyTask(i);pool.submit(my);}} }
http://www.hkea.cn/news/14513227/

相关文章:

  • 企业邮箱 网站建设wordpress代码演示
  • 网站类型的销售ui设计培训学校哪家好
  • 西宁网站建设哪家公司好天商阳光网站邮箱
  • 上海金山网站建设工程信息建程网
  • 金华市建设银行网站广州旅游攻略
  • wordpress安装ssl后网站404网站如何备案流程图
  • 肖云路那有做网站公司商城网站 备案
  • 网站结构优化的内容和方法网站建设项目收获
  • 网站中下拉列表框怎么做大型网站有哪些用php做的
  • php如何做音乐网站怎么做网站备份
  • 一线城市网站建设费用高高端h5网站
  • 已有备案网站增加域名济南网站建设设计制作公司
  • 电商网站平台有哪些功能模块福州婚庆网站建设哪个公司比较专业
  • 网站asp代码阳江网络公司
  • 泰州网站建设电话山东做网站公司有哪些
  • 网站建设成本控制国家开发银行生源地助学贷款系统
  • 宁波网站设计皆选蓉胜网络网络推广服务开票
  • 广西 网站开发wordpress在页面添加文章分类导航
  • 奉化网站建设报价如何快速被百度收录
  • 地产设计网站如何创办一个网站
  • 做网站后台用什么语言广安市网站建设公司
  • 凡科建站怎么删除模块化妆品网站建设预算明细表
  • 做社区生意的网站官网建设报价
  • 惠州网站模板建站微信网页版登录界面
  • 正规购物网站建设洛阳微网站建设
  • 柳州免费做网站的公司建设一个普通网站需要多少钱
  • 汕头市品牌网站建设公司手机网站空间
  • 如何做简易网站18款黄台禁用免费软件app
  • 网站建设上传图片不显示wordpress ping百度
  • 买了阿里云怎么做网站西安网站制作排名