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

嘉兴网站开发与制作虚拟主机网站被挂马

嘉兴网站开发与制作,虚拟主机网站被挂马,炫酷网站源码,怎样免费注册自己网站的域名介绍 什么是线程池#xff1f; 管理一系列线程的资源池。当有任务要处理时#xff0c;直接从线程池中获取线程来处理#xff0c;处理完之后线程并不会立即被销毁#xff0c;而是等待下一个任务。 为什么要使用线程池#xff1f; 池化技术的思想主要是为了减少每次获取资… 介绍 什么是线程池 管理一系列线程的资源池。当有任务要处理时直接从线程池中获取线程来处理处理完之后线程并不会立即被销毁而是等待下一个任务。 为什么要使用线程池 池化技术的思想主要是为了减少每次获取资源的消耗提高对资源的利用率。 线程池提供了一种限制和管理资源包括执行一个任务的方式。 每个线程池还维护一些基本统计信息例如已完成任务的数量。 创建线程池 两种方式创建线程池 通过ThreadPoolExecutor构造函数来创建推荐 通过Executor框架的工具类Executor来创建 FixedThreadPool 特点该线程池维护固定数量的线程线程数量不会变化。当有新任务提交时如果有空闲线程则立即执行如果所有线程都在忙碌新任务会暂存在任务队列中待有线程空闲时再执行。适用场景适用于需要控制线程数量的情况例如避免系统资源被过多的线程占用。 SingleThreadExecutor 特点该线程池只包含一个线程所有任务按顺序在这个线程中执行。如果有多个任务被提交它们会按照先入先出的顺序被放入任务队列中等待线程执行。适用场景适用于需要保证任务按顺序执行的场景例如需要按照队列中的顺序处理任务。 CachedThreadPool 特点该线程池的线程数量可根据实际情况动态调整。初始时线程池中不包含任何线程。当有新任务提交时如果没有可用线程则会创建新线程处理任务如果线程在一段时间内闲置会被销毁以节省资源。适用场景适用于任务数量和任务执行时间不确定的情况能够根据需求动态调整线程数量。 ScheduledThreadPool 特点该线程池用于在给定的延迟后运行任务或者定期执行任务。可以设置核心线程数量根据需要动态创建线程来处理任务。适用场景适用于需要定期执行任务或者延迟执行任务的场景例如定时任务调度。 谈谈Executor框架创建线程池有什么不好的地方呢 FixedThreadPool: 弊端: 固定大小的线程池使用的是无界的 LinkedBlockingQueue。当任务提交速度快于任务执行速度时任务队列可能会持续增长直到消耗完系统的内存资源导致 OutOfMemoryError。此外固定大小的线程池的线程数是固定的可能无法应对任务数量的剧增导致无法处理新的任务从而造成任务堆积或请求响应延迟。 SingleThreadExecutor: 弊端: 单线程的线程池使用的也是无界的 LinkedBlockingQueue因此也存在任务队列持续增长导致内存耗尽的风险。此外由于只有一个线程如果该线程发生异常而终止整个线程池就会无法处理新的任务造成请求响应延迟或任务堆积。 CachedThreadPool: 弊端: 缓存线程池使用的是同步队列 SynchronousQueue它不会保存任务而是会立即将任务交给线程执行。如果任务提交速度快于任务执行速度会导致线程池不断创建新的线程直到耗尽系统的内存资源最终导致 OutOfMemoryError。此外线程池中的线程数量是不受限制的当任务数量剧增时可能会创建大量线程影响系统的稳定性。 ScheduledThreadPool 和 SingleThreadScheduledExecutor: 弊端: 定时任务线程池使用的是无界的延迟阻塞队列 DelayedWorkQueue同样存在任务队列持续增长导致内存耗尽的风险。当定时任务提交速度快于执行速度时任务队列可能会不断增长最终耗尽系统的内存资源导致 OutOfMemoryError。 ThreadPoolExecutor的使用以及注意事项 这里是线程池创建的构造方法下面我们来说说它参数的一些细节 /*** 用给定的初始参数创建一个新的ThreadPoolExecutor。*/ public ThreadPoolExecutor(int corePoolSize, // 线程池的核心线程数量int maximumPoolSize, // 线程池的最大线程数long keepAliveTime, // 当线程数大于核心线程数时多余的空闲线程存活的最长时间TimeUnit unit, // 时间单位BlockingQueueRunnable workQueue, // 任务队列用来储存等待执行任务的队列ThreadFactory threadFactory, // 线程工厂用来创建线程一般默认即可RejectedExecutionHandler handler // 拒绝策略当提交的任务过多而不能及时处理时我们可以定制策略来处理任务) {// 参数合法性校验if (corePoolSize 0 ||maximumPoolSize 0 ||maximumPoolSize corePoolSize ||keepAliveTime 0)throw new IllegalArgumentException();// 参数非空性校验if (workQueue null || threadFactory null || handler null)throw new NullPointerException();// 将参数赋值给对应的成员变量this.corePoolSize corePoolSize; // 设置核心线程数this.maximumPoolSize maximumPoolSize; // 设置最大线程数this.workQueue workQueue; // 设置任务队列this.keepAliveTime unit.toNanos(keepAliveTime); // 设置空闲线程的存活时间this.threadFactory threadFactory; // 设置线程工厂this.handler handler; // 设置拒绝策略 }ThreadPoolExecutor 3 个最重要的参数 corePoolSize: 任务队列未达到队列容量时最大可以同时运行的线程数量。maximumPoolSize: 任务队列中存放的任务达到队列容量的时候当前可以同时运行的线程数量变为最大线程数。workQueue: 新任务来的时候会先判断当前运行的线程数量是否达到核心线程数如果达到的话新任务就会被存放在队列中。 其他参数 keepAliveTime:当线程数大于核心线程数时多余的空闲线程存活的最长时间。unit: keepAliveTime 参数的时间单位。threadFactory:executor 创建新线程的时候会用到。handler:饱和策略。 下面举一个例子来说明这几个参数 让我们将线程池比喻成一个小公司并对其中的参数进行解释 假设我们有一个小公司公司员工可以处理任务而线程池中的线程就相当于公司的员工任务则相当于公司要处理的工作。 corePoolSize核心员工数这是公司正式员工的数量。无论工作量如何公司始终保持这么多员工。每个员工可以同时处理一个任务。 maximumPoolSize最大员工数这是公司允许的最大员工数量包括核心员工和临时员工。当工作量增加时公司会招募临时员工来应对高峰时期的工作压力。 keepAliveTime员工空闲时间如果公司员工超过核心员工数量那么多余的员工会被视为临时员工。当这些临时员工在一段时间内没有工作可做时公司会解雇他们。这个时间就是空闲时间超过这个时间临时员工就会被解雇。 workQueue工作队列这是公司的工作任务队列用来存放还未被处理的任务。如果所有的员工都在忙于处理任务而新的任务又不断涌入那么这些任务就会暂时放在队列中等待员工有空闲的时候再处理。 threadFactory员工招聘渠道这是公司用来招聘新员工的渠道。线程工厂负责创建新的线程员工你可以自定义线程工厂来创建线程。 handler拒绝任务政策当公司处理不过来任务时会采取一定的策略来处理。例如可以采取拒绝策略直接拒绝接收新任务或者采取临时雇佣策略暂时招募更多员工来应对高峰时期的工作压力。 下面是一个demo在Spring Boot环境下运行 线程池配置类 package com.pxl.bi.config;import com.pxl.bi.common.ErrorCode; import com.pxl.bi.exception.BusinessException; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;import java.util.concurrent.*;import org.jetbrains.annotations.NotNull;Configuration Slf4j public class ThreadPoolExecutorConfig {Beanpublic ThreadPoolExecutor threadPoolExecutor() {// 创建一个线程工厂ThreadFactory threadFactory new ThreadFactory() {// 初始化线程数为 1private int count 1;Override// 每当线程池需要创建新线程时就会调用newThread方法// NotNull Runnable r 表示方法参数 r 应该永远不为null// 如果这个方法被调用的时候传递了一个null参数就会报错public Thread newThread(NotNull Runnable r) {// 创建一个新的线程Thread thread new Thread(r);// 给新线程设置一个名称名称中包含线程数的当前值thread.setName(线程 count);// 线程数递增count;// 返回新创建的线程return thread;}};// 创建一个拒绝执行处理器ThreadPoolExecutor threadPoolExecutor getThreadPoolExecutor(threadFactory);// 返回创建的线程池return threadPoolExecutor;}NotNullprivate static ThreadPoolExecutor getThreadPoolExecutor(ThreadFactory threadFactory) {RejectedExecutionHandler rejectionHandler new RejectedExecutionHandler() {Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {// 这里可以根据具体业务需求来处理拒绝执行的任务log.error(线程处理已满拒绝处理服务);throw new BusinessException(ErrorCode.SYSTEM_BUSY,系统繁忙);}};// 创建一个新的线程池线程池核心大小为2最大线程数为4// 非核心线程空闲时间为100秒任务队列为阻塞队列长度为4使用自定义的线程工厂创建线程ThreadPoolExecutor threadPoolExecutor new ThreadPoolExecutor(2, 4, 100, TimeUnit.SECONDS,new ArrayBlockingQueue(4), threadFactory, rejectionHandler);return threadPoolExecutor;} } 这里是任务添加控制类 package com.pxl.bi.controller;import cn.hutool.json.JSONUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Profile; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource; import java.util.HashMap; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ThreadPoolExecutor;/*** 队列测试*/ Profile({dev,local}) RestController Slf4j RequestMapping(/queue) public class QueueController {Resourceprivate ThreadPoolExecutor threadPoolExecutor;/*** 接收一个名为name的任务将任务添加到线程池中* param name*/GetMapping(/add)public void add(String name){// 使用CompletableFuture运行一个异步任务CompletableFuture.runAsync(() - {// 打印一条日志信息包括任务名称和执行线程的名称log.info(任务执行中 name 执行人 Thread.currentThread().getName());try {// 让线程休眠10分钟模拟长时间运行的任务Thread.sleep(600000);} catch (InterruptedException e) {e.printStackTrace();}// 异步任务在threadPoolExecutor中执行}, threadPoolExecutor);}/*** 获取线程池中的信息* return*/GetMapping(/get)public String get(){// 创建一个HashMap存储线程池的状态信息MapString, Object map new HashMap();//获取线程池大小int size threadPoolExecutor.getQueue().size();// 将队列长度放入map中map.put(队列长度, size);// 获取线程池已接收的任务总数long taskCount threadPoolExecutor.getTaskCount();// 将任务总数放入map中map.put(任务总数, taskCount);// 获取线程池已完成的任务数long completedTaskCount threadPoolExecutor.getCompletedTaskCount();// 将已完成的任务数放入map中map.put(已完成任务数, completedTaskCount);// 获取线程池中正在执行任务的线程数int activeCount threadPoolExecutor.getActiveCount();// 将正在工作的线程数放入map中map.put(正在工作的线程数, activeCount);// 将map转换为JSON字符串并返回return JSONUtil.toJsonStr(map);} }加入这两个类了就可以使用Swagger或postman进行测试了。 线程池饱和策略 如果当前同时运行的线程数量达到最大线程数量并且队列也已经被放满了任务时ThreadPoolExecutor 定义一些策略: ThreadPoolExecutor.AbortPolicy 抛出 RejectedExecutionException来拒绝新任务的处理。默认ThreadPoolExecutor.CallerRunsPolicy 调用执行自己的线程运行任务如果任务时间过长可能会导致当前服务直接堵死ThreadPoolExecutor.DiscardPolicy 不处理新任务直接丢弃掉。ThreadPoolExecutor.DiscardOldestPolicy 此策略将丢弃最早的未处理的任务请求。 线程池中常用的阻塞队列有哪些 LinkedBlockingQueue无界队列 应用于FixedThreadPool和SingleThreadExecutor。无界队列意味着队列可以无限增长不会出现任务被拒绝的情况。在FixedThreadPool和SingleThreadExecutor中无界队列的作用是用来存储等待执行的任务而且这两种线程池都有固定的核心线程数因此任务队列永远不会被放满。 SynchronousQueue同步队列 应用于CachedThreadPool。SynchronousQueue 是一个没有容量的队列它不存储元素而是直接将任务交给线程执行。在CachedThreadPool中每当有任务提交时如果有空闲线程则立即使用如果没有则会新建一个线程来处理任务。这种设计使得CachedThreadPool的线程数可以根据需求动态地增加但同时也会增加系统资源的消耗可能导致OutOfMemoryError。 DelayedWorkQueue延迟阻塞队列 应用于ScheduledThreadPool和SingleThreadScheduledExecutor。DelayedWorkQueue 用于存储延迟执行的任务并根据任务的延迟时间对任务进行排序。它的内部采用堆的数据结构保证每次出队的任务都是当前队列中执行时间最靠前的。这种队列的特性使得ScheduledThreadPool和SingleThreadScheduledExecutor能够按照预定的时间执行任务而且队列不会阻塞可以动态地扩容最多只能创建核心线程数的线程。 线程池执行流程 如何给线程池命名 两种方式实现 利用 guava 的 ThreadFactoryBuilder 自己实现 ThreadFactory。 guava 的 ThreadFactoryBuilder import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory;public class Main {public static void main(String[] args) {// 创建一个 ThreadFactoryBuilderThreadFactoryBuilder threadFactoryBuilder new ThreadFactoryBuilder();// 设置线程名称格式threadFactoryBuilder.setNameFormat(my-pool-%d);// 创建 ThreadFactoryThreadFactory threadFactory threadFactoryBuilder.build();// 使用自定义的 ThreadFactory 创建线程池ExecutorService executorService Executors.newFixedThreadPool(5, threadFactory);// 提交一些任务到线程池中for (int i 0; i 10; i) {executorService.submit(() - {System.out.println(Thread.currentThread().getName() is executing task);});}// 关闭线程池executorService.shutdown();} }自己实现ThreadFactory实现命名 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory;public class NamedThreadFactoryExample {public static void main(String[] args) {// 创建一个带有自定义命名的线程池ExecutorService executorService Executors.newFixedThreadPool(5, new NamedThreadFactory(MyThreadPool));// 提交一些任务到线程池中for (int i 0; i 10; i) {executorService.submit(() - {System.out.println(Thread.currentThread().getName() is executing task);});}// 关闭线程池executorService.shutdown();} }// 自定义的线程工厂类 class NamedThreadFactory implements ThreadFactory {private final String namePrefix;public NamedThreadFactory(String namePrefix) {this.namePrefix namePrefix;}Overridepublic Thread newThread(Runnable r) {// 创建一个新线程并设置名称Thread t new Thread(r, namePrefix -Thread);return t;} }扩展 如何设置线程池大小问题 主要其实还是看具体的业务场景来看有些时候实际处理能力或需求只有那么多如果线程太多会导致性能上的浪费。 有一个简单并且适用面比较广的公式 CPU 密集型任务(N1) 这种任务消耗的主要是 CPU 资源可以将线程数设置为 NCPU 核心数1。用来计算之类的操作I/O 密集型任务(2N) 这种任务应用起来系统会用大部分的时间来处理 I/O 交互而线程在处理 I/O 的时间段内不会占用 CPU 来处理这时就可以将 CPU 交出给其它线程使用。一般这种使用在文件传输、通信、数据库访问等方面 如何动态修改线程池的参数 使用可调整的线程池实现 Java 并发包中提供了 ThreadPoolExecutor 类的相关实现例如 ScheduledThreadPoolExecutor 和 ThreadPoolExecutor。它们允许你动态地修改线程池的参数如核心线程数、最大线程数、任务队列大小等。你可以通过提供新的参数值来调用相应的 setter 方法来实现动态修改。 使用自定义的动态调整方法 你可以编写自定义的方法来动态地调整线程池的参数。例如你可以编写一个方法定期检查系统的负载情况根据负载情况动态地调整线程池的参数。这种方法需要一定的编程技巧和经验但可以根据具体需求来实现更灵活和智能的调整。 使用监控工具 你可以使用监控工具来监视线程池的运行状态和性能指标如活动线程数、任务队列长度、任务完成率等。根据监控数据的分析你可以手动或自动地调整线程池的参数。常用的监控工具包括 JConsole、VisualVM、Prometheus 等。 使用外部配置文件 你可以将线程池的参数配置到外部配置文件中如 properties 文件、XML 文件等。然后在程序运行时动态地加载和解析配置文件根据配置文件中的参数值来调整线程池的参数。这种方法适用于需要频繁修改参数但又不希望修改源代码的情况。 使用管理平台 如果你的应用程序部署在容器或云平台上通常会提供管理平台或控制台你可以通过管理平台来动态地调整线程池的参数。例如在容器管理平台中你可以通过修改容器的环境变量或配置文件来修改线程池的参数。 下面是两个可以实现动态线程池的开源程序 Hippo4jopen in new window异步线程池框架支持线程池动态变更监控报警无需修改代码轻松引入。支持多种使用模式轻松引入致力于提高系统运行保障能力。Dynamic TPopen in new window轻量级动态线程池内置监控告警功能集成三方中间件线程池管理基于主流配置中心。
http://www.dnsts.com.cn/news/56844.html

相关文章:

  • 如何制作自己的网站 可放广告网站建设平台合同模板
  • seo做的好的网站 知乎专业做招聘的网站
  • 凡客诚品官方网站瑞安网站
  • 做网站银川江苏省建是国企吗
  • 咸鱼网站做链接科技创新导报
  • 四川省建设厅职改办网站兰州网站维护公司
  • 中铁建设集团门户网站登陆wordpress 自动生成标签
  • uniapp做网站小规模公司简介怎么写
  • php网站如何做多语言WordPress添加百度联盟
  • 网上书店网站建设规划书网站的二维码怎么做的
  • 诸暨做网站公司怀化网站建设设计
  • 无锡网站建设制作设计海淀商城网站建设
  • 网站做的题不小心关闭了做网站月入100万
  • 纯html静态网站深圳住房和建设局网站首页
  • 用wex5可以做网站吗上海做推广的引流公司
  • 南昌做兼职的网站h5响应式音乐网站模板
  • 电子商务网站建设方面的论文自微网站
  • 网站用什么语言建设工程规划许可证在哪个网站查询
  • wordpress网站都有哪些wordpress 短网址
  • 专业网站设计公司排行榜怎么利用360域名做网站
  • python做网站性能wordpress支持微信登录
  • 网站开发网页设计北京师范大学出版社网站建设书籍在线阅读
  • 哪里培训做网站wordpress多用户博客系统
  • DMZ做网站工装网站建设方案
  • 静态网站建设摘要西安专业做网站建
  • 网站设计的步骤深圳网站建设 利科技有限公司
  • 天津专业做网站的公司有哪些湖州网站设计建设
  • 湖北什么是网站建设宁波企业网站建设公司
  • 网站开发需要多少钱销售怎么制作公众号教程
  • 旅游网站建设技术有哪些内容中国网页设计欣赏