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

网站的规划与建设课程设计免费商用的网站模板

网站的规划与建设课程设计,免费商用的网站模板,江苏商城网站建设,沈阳小程序开发定制文章目录 一、为什么要用线程池1.1 单线程的问题1.2 手动创建多线程的问题1.3 线程池的作用#xff08;优点#xff09;1.4 线程池的使用场景 二、线程池的基础知识2.1 线程池的核心组件2.2 JUC中的线程池架构2.3 线程池的配置参数2.4 线程池常见的拒绝策略#xff08;可自定… 文章目录 一、为什么要用线程池1.1 单线程的问题1.2 手动创建多线程的问题1.3 线程池的作用优点1.4 线程池的使用场景 二、线程池的基础知识2.1 线程池的核心组件2.2 JUC中的线程池架构2.3 线程池的配置参数2.4 线程池常见的拒绝策略可自定义2.5 线程池的生命周期2.6 线程池的任务调度规则2.7 线程池执行器的钩子方法 三、使用基础3.1 常见的工作队列3.2 Executors提供的线程池3.3 使用Executors创建线程的问题 四、开发实践4.1 线程数量配置4.2 提交任务以submit(callable)为例4.3 关闭线程池 参考 一、为什么要用线程池 1.1 单线程的问题 单线程无法利用CPU的多核资源且存在阻塞问题。使用单个线程来处理一组任务若当前任务阻塞了线程该线程将失去CPU的使用权而不是去执行其他可以执行的任务。 1.2 手动创建多线程的问题 需要开发人员去管理线程的生命周期麻烦且可能出错。 还存在并发数不可控的问题如每次到达一个任务时都新建一个线程来处理当大量任务到达时会创建大量的线程导致线程间的竞争加剧且可能导致系统资源耗尽。 1.3 线程池的作用优点 节省线程创建和销毁的开销线程池通过复用一组线程可以节省频繁创建和销毁线程的开销。控制并发数线程池可以控制最大并发数避免线程过多导致系统资源耗尽。提高响应速度当任务到达时可以直接使用线程池中已经创建好的线程节省了新建线程的时间。管理线程线程池负责内部线程的生命周期管理包括创建、销毁和调度等无需人工干预。 1.4 线程池的使用场景 处理并发请求每个请求都要一个线程来处理使用线程池来复用一组线程能节省创建和销毁线程的开销。执行异步任务避免耗时操作如邮件发送、文件上传阻塞主线程可以使用线程池来异步执行这些任务。处理IO密集型任务线程在进行IO操作时会阻塞使用线程池来调度这些任务可以在任务阻塞时调度其他任务继续执行避免CPU空闲。处理计算密集型任务使用线程池来执行计算密集型任务可以充分利用CPU的多核资源也能控制并发数量避免系统资源耗尽。后台服务利用线程池来执行后台服务与前台线程的执行独立互不影响。执行定时任务与周期性任务可以使用ScheduledThreadPool在后台执行这些任务与前台线程的执行独立。 二、线程池的基础知识 2.1 线程池的核心组件 线程池管理器负责线程池的创建、销毁、管理和配置。工作线程工作线程是线程池中的实际工作者负责执行提交给线程池的任务。任务接口每个提交到线程池的任务都需要实现一个任务接口。Runnable用于定义无需返回值的任务而Callable则用于定义可以有返回值的任务并且可以抛出异常。工作队列任务队列用于暂存等待被执行的任务有多种实现方式未必是先进先出。线程工厂线程工厂的作用是定义一个规范来创建线程允许在创建线程时进行定制化设置例如设置线程的名称、优先级、是否为守护线程daemon thread等属性。拒绝策略见后。 后三个核心组件是线程池的后三个配置参数 2.2 JUC中的线程池架构 Executor 是线程池管理器的顶层接口只定义了一个方法void execute(Runnable command)用来提交Runnable任务。 ExecutorService 该接口扩展了Executor增加了更多管理线程池的方法如提交Callable任务、提交批量任务、线程池的生命周期管理shutdown()和shutdownNow()、获取线程池状态等。 AbstractExecutorService实现了该接口中的部分方法为创建自定义的线程池服务实现提供了基础框架。 ThreadPoolExecutor继承自AbstractExecutorService是JUC中线程池管理器的核心实现类。 Executors是一个静态工厂类提供了多种线程池管理器。 ScheduledExecutorService 该接口扩展了ExecutorService增加了定时执行和周期性执行任务的功能。ScheduledThreadPoolExecutor实现该接口专为计划任务而设计。 2.3 线程池的配置参数 corePoolSize核心线程数。maximumPoolSize最大线程数。keepAliveTime空闲线程存活时间。当线程池中的工作线程数量超过核心线程数时额外的工作线程在空闲这个时间段后会被终止直到工作线程数量降到核心线程数。但如果设置了allowCoreThreadTimeOut为true那么核心线程也可以被终止。unit空闲线程存活时间的单位可以用枚举类TimeUnit设置。workQueue工作队列。threadFactory线程工厂。handler拒绝策略。当阻塞队列已满且工作线程数大于等于最大线程数时无法接受新的任务会按照拒绝策略进行处理。 2.4 线程池常见的拒绝策略可自定义 AbortPolicy拒绝策略。是默认策略会将新任务拒绝并且抛出RejectedExecutionException异常。DiscardPolicy抛弃策略。会将新任务丢掉但不会跑出异常。DiscardOldestPolicy抛弃最老任务策略。不是丢弃新任务而是先丢弃最先进入队列的任务然后将新任务入队。CallerRunsPolicy调用者执行策略。让提交任务的线程去执行新任务而不是使用线程池中的线程去执行。 2.5 线程池的生命周期 New新建状态。当线程池创建后但尚未开始执行任务时它处于新建状态。此时线程池中的线程尚未启动。Running运行状态。新建的线程池开始接受并处理任务后就会进入运行状态这是线程池的正常工作状态可以接收新任务和处理工作队列中的任务。Shutdown关闭状态。调用shutdown()方法后线程池会进入关闭状态。此时线程池不再接受新任务但不会立刻终止它会继续处理队列中已有的任务直到所有任务完成。Stop停止状态。调用shutdownNow()方法后线程池会进入停止状态此时会中断正在执行任务的线程清空任务队列并返回未开始执行的任务列表。Tidying整理状态。完成关闭状态或停止状态的工作后线程池会进入整理状态。此阶段线程池中的线程数量降为0即将调用terminated()钩子方法。Terminated终止状态。在整理状态后线程池调用terminated()方法并进入终止状态。此时线程池生命周期结束会释放所有资源。 2.6 线程池的任务调度规则 当向线程池提交一个任务时 若线程池中的工作线程数量小于核心线程数执行器总是优先创建一个新的工作线程来执行任务而不是使用一个空闲的工作线程目的是快速让线程池中有足够的活跃线程。若工作线程数量大于等于核心线程数则根据工作队列的情况进行相应的处理。若工作队列未满则将任务入队。若工作队列已满则根据工作线程数量与最大线程数的关系进行相应的处理。若工作线程数大于等于最大线程数则执行拒绝策略。否则会新建一个非核心线程来立即执行新的任务。 2.7 线程池执行器的钩子方法 beforeExecute(Thread t, Runnable r): 任务执行之前的钩子方法。 afterExecute(Runnable r, Throwable t) 任务执行之后的钩子方法。 terminated() 线程池终止时的钩子方法。 三、使用基础 3.1 常见的工作队列 工作队列基于阻塞队列实现我们可以实现BlockingQueue来自定义阻塞队列也可以使用JUC中提供的阻塞队列 ArrayBlockingQueue基于数组的有界阻塞队列。队列大小是固定的在创建时必须指定。由于是基于数组所以访问速度快但可能有扩容受限的问题。LinkedBlockingQueue基于链表的阻塞队列。如果不指定容量则默认为Integer.MAX_VALUE。相比ArrayBlockingQueue插入和删除操作可能稍微慢一点但由于链表的动态性它可以更灵活地调整大小。PriorityBlockingQueue基于最小堆的无界的优先级队列元素按照自然排序或提供的比较器进行排序。任务按照优先级顺序被处理而非先进先出。DelayQueue基于PriorityBlockingQueue的无界阻塞队列其中元素只有在延迟期满后才能被获取否则将阻塞等待常用于实现定时任务和延迟操作。SynchronousQueue一个特殊的队列它没有内部容量每个插入操作必须等待另一个线程的对应移除操作反之亦然。适用于直接的生产者-消费者传递非常适合传递性操作。LinkedTransferQueue一个由链表结构组成的无界阻塞队列支持公平和非公平模式。它还提供了一个tryTransfer()方法允许生产者直接将元素转移给等待中的消费者如果没有消费者等待则可以选择是否阻塞生产者可阻塞。LinkedBlockingDeque双向链表实现的双向阻塞队列既可以用作栈也可以用作队列。它支持有限或无界的队列并提供了putFirst()、putLast()等方法来控制元素的插入位置。 3.2 Executors提供的线程池 3.3 使用Executors创建线程的问题 定长线程池/单线程话线程池阻塞队列无界可能导致JVM出现OOMOut Of Memory异常。定时线程池/可缓存线程池最大线程数量不设限上如果任务提交较多就会造成大量的线程被启动可能造成OOM异常也可能导致CPU线程资源耗尽。 四、开发实践 4.1 线程数量配置 IO密集型 核心线程数设置得比CPU核心数稍大因为当线程在等待I/O时CPU可以调度其他线程执行。最大线程数可以设置得更高甚至远大于CPU核心数具体数值取决于系统的I/O能力及预期的并发水平。一般推荐设置为2 * CPU核心数或更高但需注意不要设置得过高以免过度消耗系统资源。 计算密集型 核心线程数和最大线程数通常设置为CPU核心数因为在这种情况下更多的线程并不能带来性能提升反而会因为上下文切换带来额外开销。 4.2 提交任务以submit(callable)为例 // 创建线程池ExecutorService executor Executors.newSingleThreadExecutor();// 创建Callable任务对象CallableResult task () - {// ...};// 提交任务并获取Future对象FutureResult future executor.submit(task); // 提交任务并获取Future// 获取结果try {// get()方法会阻塞如果任务执行过程中发生了异常那么此处会抛出该异常Result res future.get();} catch (InterruptedException e) {// 处理中断异常...} catch (ExecutionException e) {// 处理执行异常...}// 关闭ExecutorServiceexecutor.shutdown();4.3 关闭线程池 调用shutdown()或shutdownNow()后当前线程不会等待线程池的关闭若当前线程结束了可能导致内存泄露和资源浪费。 若线程池中还有活动的线程就算主线程结束了JVM也会因为存在活跃的非守护线程而无法退出导致应用程序无法正常退出。 awaitTermination()方法用来阻塞当前线程直到线程池中的所有任务完成执行或者超时或者当前线程被中断。可以用于等待线程池中的线程全部执行完后再退出当前线程线程池中的所有线程在超时前执行完毕会返回true并恢复当前线程的执行。 ExecutorService executorService Executors.newFixedThreadPool(10);// ... 提交任务到线程池// 关闭线程池 executorService.shutdown(); try {// 等待一定时间直到超时或者线程池中的线程全部执行结束if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) {// 如果超时则尝试强制关闭executorService.shutdownNow();// 等待一定时间直到超时或者线程池中的线程全部执行结束if (!executorService.awaitTermination(60, TimeUnit.SECONDS))System.err.println(线程池未在规定时间内停止);} } catch (InterruptedException ie) {// 强制终止线程池executorService.shutdownNow();// 保持当前线程的中断状态Thread.currentThread().interrupt(); }参考 Java线程池超详细 Java 多线程彻底搞懂线程池
http://www.w-s-a.com/news/807782/

相关文章:

  • 旅游网网站建设网站如何自己做seo
  • 如何验证网站所有权做二手家具回收哪个网站好
  • 做哪种网站赚钱项目开发流程
  • 网站建设和网站网络推广网站建设软件定制
  • 站长工具网址查询全球云邮登陆网站
  • 宁波 住房和建设局网站网上发帖推广
  • 平面设计在线网站工业设计公司有哪些
  • 福州网站设计外包公司网站做的比较好
  • 如何设计网站首页网站开发综合技能实训心得体会
  • 用织梦做的网站好用吗w网站链接如何做脚注
  • 东莞做网站公司在哪哪里有网站培训的
  • 做宣传 为什么要做网站那重庆网站建设公司在线联系
  • 网站设计制作售价多少钱制作图片的软件是
  • 网站验证码目录简单带数据库的网站模版
  • 制作网站用c#做前台网站建设专题的意义
  • 广西建设职业技术学院教育网站牡丹区建设局网站
  • 网站后台怎么用ftp打开上海外贸进出口有限公司
  • 淘宝建设网站的意义大学生做那个视频网站
  • 如何提高你的网站的粘性建设银行流水网站
  • 微信h5在哪个网站做泰州专业网站制作公司
  • 现在.net做网站的多吗建设工程造价网
  • pc访问手机网站跳转违法网站开发人员
  • 网站前端做报名框wordpress 启动慢
  • 沈阳做网站客户多吗前端可以做网站吗
  • 网站设计规划书新媒体营销策略分析
  • dw个人网站主页怎么做天津工程信息建设网
  • 顺义做网站的公司网站页面设计基础教程
  • 安阳哪个公司做网站好企业没有做网站有的坏处
  • 网站开发有必要用php框架wordpress分页导航代码
  • wordpress建站seo鞍山制作网站哪家好