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

做html网站模板怎么做网络广告推广

做html网站模板,怎么做网络广告推广,汕头论坛网,域名备案是什么线程池简述 为什么需要一个线程池工具类? 答:整个项目,用到线程执行任务的地方很多,不可能哪里用到就在那里直接new一个线程执行,这样资源得不到重复利用,一旦线程过多就会导致内存不足。 线程池的好处是…

线程池简述

为什么需要一个线程池工具类?

答:整个项目,用到线程执行任务的地方很多,不可能哪里用到就在那里直接new一个线程执行,这样资源得不到重复利用,一旦线程过多就会导致内存不足。

线程池的好处是什么?

答:使用线程池执行线程任务,当一个线程执行完成一个任务之后,线程资源回到线程池,资源得到重复利用。

线程池为什么使用自定义方式?

阿里文档推荐使用自定义线程池,因为java自带线程池都会有可能造成内存不足的问题。自定义线程池,根据服务器配置定制线程池核心线程、最大线程等,是最好的方式。

二、工具类代码和测试代码

导包

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.1-jre</version></dependency>

工具类 

import com.google.common.util.concurrent.ThreadFactoryBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.*;/*** 自定义线程创建工具类,创建线程池后不需要关闭** @author liangxn*/
public class ThreadPoolUtils {private static final Logger LOGGER = LoggerFactory.getLogger(ThreadPoolUtils.class);private static ThreadPoolExecutor threadPool = null;private static final String POOL_NAME = "myPool";// 等待队列长度private static final int BLOCKING_QUEUE_LENGTH = 20000;// 闲置线程存活时间private static final int KEEP_ALIVE_TIME = 60 * 1000;private ThreadPoolUtils() {throw new IllegalStateException("utility class");}/*** 无返回值直接执行** @param runnable 需要运行的任务*/public static void execute(Runnable runnable) {getThreadPool().execute(runnable);}/*** 有返回值执行* 主线程中使用Future.get()获取返回值时,会阻塞主线程,直到任务执行完毕** @param callable 需要运行的任务*/public static <T> Future<T> submit(Callable<T> callable) {return getThreadPool().submit(callable);}public static synchronized ThreadPoolExecutor getThreadPool() {if (threadPool == null) {// 获取处理器数量int cpuNum = Runtime.getRuntime().availableProcessors();// 根据cpu数量,计算出合理的线程并发数int maximumPoolSize = cpuNum * 2 + 1;// 核心线程数、最大线程数、闲置线程存活时间、时间单位、线程队列、线程工厂、当前线程数已经超过最大线程数时的异常处理策略threadPool = new ThreadPoolExecutor(maximumPoolSize - 1,maximumPoolSize,KEEP_ALIVE_TIME,TimeUnit.MILLISECONDS,new ArrayBlockingQueue<>(BLOCKING_QUEUE_LENGTH),new ThreadFactoryBuilder().setNameFormat(POOL_NAME + "-%d").build(),new ThreadPoolExecutor.AbortPolicy() {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor e) {LOGGER.warn("线程爆炸了,当前运行线程总数:{},活动线程数:{}。等待队列已满,等待运行任务数:{}",e.getPoolSize(),e.getActiveCount(),e.getQueue().size());}});}return threadPool;}
}

 线程池的七个参数讲解

  • corePoolSize:线程池核心大小。线程池中会维护最小的线程线程数量,即使这些线程处于空闲状态,他们也不会销毁,除非设置了allowCoreThreadTimeOut。
  • maximumPoolSize:线程池最大线程数量。一个任务被提交到线程池以后,首先会找有没有空闲存活的线程,如果有则直接将任务提交给空闲线程,如果没有,就会缓存到工作队列中。如果工作队列满了,才会新建一个线程,然后从工作队列的头部去除一个任务交由新线程来处理,而将刚提交的任务放入工作队列的尾部。线程池不会无限制的去创建新线程,它会有一个最大线程数量限制,这个数量即由maximunPoolSize指定。
  • keepAliveTime:空闲线程存活时间。一个线程如果处于空闲状态,且当前的线程数量大于corePoolSize,那么在指定时间后,这个空闲线程就会被销毁。
  • unit:空闲线程存活时间单位。keepAliveTime的计量单位。
  • workQueue:工作队列。新任务被提交以后,会进入到此工作队列中,任务调度时再从队列中取出任务。
  • threadFactory:线程工厂。创建一个新线程使用的工厂,可以用来设定线程名
  • hander:拒绝策略。当工作队列中的任务已达到最大限制,并且线程池中的线程数量已达到最大限制,这时如果有新任务提交进来,该如何处理呢。这里的拒绝策略,就是解决这个问题。

四种工作队列

  1. ArrayBlockingQueue:基于数组的有界阻塞队列,按FIFO排序。新任务进来后,会放到该队列的队尾,有界的数组可以防止资源耗尽问题。当线程池中的线程数量达到corePoolSize后,再有新任务进来,则会将任务放入该队列的队尾,等待被调度。如果队列已经满了,则创建一个新的线程,如果线程数量已经达到了maxPoolSize,则会执行拒绝策略。
  2. LinkedBlockingQuene:基于链表的无界阻塞队列(其实最大容量为Integer.MAX)。按FIFO排序。由于该队列的近似无界性,当线程池中线程数量达到了corePoolSize之后,再有新任务进来,会一直存在该队列,而不会去创建新的线程,知道maxPoolSize,因此使用该工作队列时,参数ma'xPoolSize其实是不起作用的。
  3. SynchronousQuene:一个不缓存任务的阻塞队列。生产者放入一个任务,必须等到消费者取出这个任务,也就是说,新任务进来时,不会缓存,而是直接被调度执行该任务,如果没有可用线程,则创建新线程,如果线程数量达到maxPoolSize,则执行拒绝策略。
  4. PriorityBlockingQueue:具有优先级的无界阻塞队列,直到资源耗尽。默认情况下,元素采用自然排序升序排列。也可以自定义实现类compareTo()方法来指定元素排序规则,或者初始化PriorityBlockingQueue时,指定构造参数Comparator来对元素进行排序。但需要注意的是,不能保证同优先级元素的顺序。

四种拒绝策略

ThreadPoolExecutor.AbortPolicy直接抛出异常(默认拒绝策略)
 ThreadPoolExecutor.DiscardPolicy丢弃当前被拒绝的任务,而不抛出异常
ThreadPoolExecutor.DiscardOldestPolicy将工作任务中最老的任务丢弃,然后重新尝试接纳被拒绝的任务
ThreadPoolExecutor.CallerRunsPolicy在客户端中执行被拒绝的任务

例子1

 Future<String> future = ThreadPoolUtils.submit(() -> {return "我有返回值哦";});try {logger.info(future.get());} catch (InterruptedException | ExecutionException e) {logger.error("任务超过指定时间未返回值,线程超时退出");}​// 控制台打印日志:21:04:19.428 [main] INFO - 我有返回值哦

例子2

 Future<String> future = ThreadPoolUtils.submit(() -> {return "我有返回值哦";});try {logger.info(future.get());} catch (InterruptedException | ExecutionException e) {logger.error("任务超过指定时间未返回值,线程超时退出");}// 控制台打印日志:21:04:19.428 [main] INFO - 我有返回值哦

例子3

int loop = 40;
for (int i = 0; i < loop; i++) {logger.info("任务{}", i);ThreadPoolUtils.execute(() -> {logger.info("干活好累");try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}logger.info("终于干完了");});}logger.info("我在这儿等着你回来等你回来");// 控制台打印:21:08:08.494 [main] INFO - 任务0............21:08:08.540 [main] INFO - 任务521:08:08.541 [main] INFO - 任务621:08:08.540 [myPool-4] INFO - 干活好累21:08:08.540 [myPool-1] INFO - 干活好累21:08:08.540 [myPool-3] INFO - 干活好累............21:08:08.543 [main] INFO - 任务2121:08:08.548 [main] INFO - 任务2221:08:08.548 [main] INFO - 任务2321:08:08.548 [myPool-21] INFO - 干活好累21:08:08.549 [main] INFO - 任务2421:08:08.549 [myPool-22] INFO - 干活好累21:08:08.549 [main] INFO - 任务2521:08:08.549 [myPool-23] INFO - 干活好累21:08:08.549 [main] INFO - 任务26............21:08:08.551 [myPool-1] INFO - 干活好累21:08:08.551 [myPool-6] INFO - 终于干完了21:08:08.551 [myPool-7] INFO - 终于干完了21:08:08.551 [myPool-5] INFO - 干活好累21:08:08.551 [main] INFO - 任务3521:08:08.551 [main] INFO - 任务3621:08:08.551 [main] INFO - 任务3721:08:08.551 [main] INFO - 任务3821:08:08.551 [main] INFO - 任务3921:08:08.551 [main] INFO - 我在这儿等着你回来等你回来21:08:08.551 [myPool-2] INFO - 干活好累21:08:08.551 [myPool-3] INFO - 干活好累21:08:08.551 [myPool-8] INFO - 干活好累21:08:08.551 [myPool-6] INFO - 干活好累21:08:08.551 [myPool-7] INFO - 干活好累21:08:08.552 [myPool-13] INFO - 终于干完了21:08:08.552 [myPool-12] INFO - 终于干完了............21:08:08.561 [myPool-7] INFO - 终于干完了21:08:08.561 [myPool-3] INFO - 终于干完了

例子4

// 测试10个线程使用工具类
ExecutorService executorService = Executors.newFixedThreadPool(10);
for (int i = 0; i < 10; i++) {executorService.submit(new Runnable() {@Overridepublic void run() {final String name = Thread.currentThread().getName();ThreadPoolUtils.execute(() -> {logger.info("[{}],干活好累", name);try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}logger.info("[{}],终于干完了", name);});}});}logger.info("不用等他,我们先干");// 控制台打印:21:11:49.946 [main] INFO - 不用等他,我们先干21:11:49.991 [myPool-4] INFO - [pool-2-thread-7],干活好累21:11:49.991 [myPool-3] INFO - [pool-2-thread-2],干活好累21:11:49.991 [myPool-5] INFO - [pool-2-thread-5],干活好累21:11:49.991 [myPool-8] INFO - [pool-2-thread-6],干活好累21:11:49.991 [myPool-1] INFO - [pool-2-thread-3],干活好累21:11:49.991 [myPool-2] INFO - [pool-2-thread-9],干活好累21:11:49.991 [myPool-9] INFO - [pool-2-thread-10],干活好累21:11:49.991 [myPool-7] INFO - [pool-2-thread-1],干活好累21:11:49.991 [myPool-6] INFO - [pool-2-thread-4],干活好累21:11:49.991 [myPool-0] INFO - [pool-2-thread-8],干活好累21:11:50.091 [myPool-7] INFO - [pool-2-thread-1],终于干完了21:11:50.091 [myPool-4] INFO - [pool-2-thread-7],终于干完了21:11:50.091 [myPool-5] INFO - [pool-2-thread-5],终于干完了21:11:50.091 [myPool-2] INFO - [pool-2-thread-9],终于干完了21:11:50.091 [myPool-0] INFO - [pool-2-thread-8],终于干完了21:11:50.091 [myPool-1] INFO - [pool-2-thread-3],终于干完了21:11:50.091 [myPool-8] INFO - [pool-2-thread-6],终于干完了21:11:50.091 [myPool-6] INFO - [pool-2-thread-4],终于干完了21:11:50.091 [myPool-3] INFO - [pool-2-thread-2],终于干完了21:11:50.091 [myPool-9] INFO - [pool-2-thread-10],终于干完了

例子5

int loop = 2000;
for (int i = 0; i < loop; i++) {ThreadPoolUtils.execute(() -> {logger.info("干活好累");try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}logger.info("终于干完了");});}logger.info("不用等他,我们先干");​// 控制台打印:............21:13:25.083 [myPool-19] INFO - 干活好累21:13:25.083 [myPool-8] INFO - 干活好累21:13:25.083 [myPool-30] INFO - 干活好累21:13:25.085 [main] WARN - 线程爆炸了,当前运行线程总数:33,活动线程数:33。等待队列已满,等待运行任务数:100021:13:25.085 [main] WARN - 线程爆炸了,当前运行线程总数:33,活动线程数:33。等待队列已满,等待运行任务数:100021:13:25.085 [main] WARN - 线程爆炸了,当前运行线程总数:33,活动线程数:33。等待队列已满,等待运行任务数:100021:13:25.085 [main] WARN - 线程爆炸了,当前运行线程总数:33,活动线程数:33。等待队列已满,等待运行任务数:100021:13:25.106 [myPool-7] INFO - 干活好累21:13:25.106 [myPool-11] INFO - 干活好累21:13:25.106 [main] WARN - 线程爆炸了,当前运行线程总数:33,活动线程数:33。等待队列已满,等待运行任务数:100021:13:25.106 [myPool-6] INFO - 干活好累21:13:25.106 [myPool-4] INFO - 干活好累21:13:25.106 [main] WARN - 线程爆炸了,当前运行线程总数:33,活动线程数:33。等待队列已满,等待运行任务数:100021:13:25.106 [main] WARN - 线程爆炸了,当前运行线程总数:33,活动线程数:33。等待队列已满,等待运行任务数:1000............

文章转载自:
http://wynd.rwzc.cn
http://oem.rwzc.cn
http://safest.rwzc.cn
http://aboideau.rwzc.cn
http://debe.rwzc.cn
http://involucrate.rwzc.cn
http://bonds.rwzc.cn
http://microspecies.rwzc.cn
http://hypesthesia.rwzc.cn
http://always.rwzc.cn
http://fennelflower.rwzc.cn
http://orthovoltage.rwzc.cn
http://stagecoach.rwzc.cn
http://nic.rwzc.cn
http://sodalist.rwzc.cn
http://acls.rwzc.cn
http://investiture.rwzc.cn
http://conjurator.rwzc.cn
http://shillong.rwzc.cn
http://granularity.rwzc.cn
http://gluewater.rwzc.cn
http://minitype.rwzc.cn
http://disbranch.rwzc.cn
http://hypnosophy.rwzc.cn
http://safetyman.rwzc.cn
http://ekistics.rwzc.cn
http://eloge.rwzc.cn
http://protoporcelain.rwzc.cn
http://aiie.rwzc.cn
http://bootee.rwzc.cn
http://species.rwzc.cn
http://autoexec.rwzc.cn
http://screamer.rwzc.cn
http://ovovitellin.rwzc.cn
http://loran.rwzc.cn
http://cladogram.rwzc.cn
http://mizenyard.rwzc.cn
http://pignus.rwzc.cn
http://bks.rwzc.cn
http://destine.rwzc.cn
http://micropulsation.rwzc.cn
http://jucar.rwzc.cn
http://endocentric.rwzc.cn
http://allround.rwzc.cn
http://triumvir.rwzc.cn
http://bahaism.rwzc.cn
http://downfield.rwzc.cn
http://handiness.rwzc.cn
http://brasswind.rwzc.cn
http://identifiableness.rwzc.cn
http://syndicate.rwzc.cn
http://trucial.rwzc.cn
http://heedfully.rwzc.cn
http://menthene.rwzc.cn
http://hyperosmolarity.rwzc.cn
http://densometer.rwzc.cn
http://thwartwise.rwzc.cn
http://demythologize.rwzc.cn
http://elenctic.rwzc.cn
http://godhead.rwzc.cn
http://canakin.rwzc.cn
http://moraine.rwzc.cn
http://habenula.rwzc.cn
http://seropositive.rwzc.cn
http://hoverpad.rwzc.cn
http://anachronism.rwzc.cn
http://whalelike.rwzc.cn
http://jackpot.rwzc.cn
http://dictaphone.rwzc.cn
http://susi.rwzc.cn
http://fratching.rwzc.cn
http://unredeemed.rwzc.cn
http://orthotics.rwzc.cn
http://scalper.rwzc.cn
http://gavelock.rwzc.cn
http://floodtime.rwzc.cn
http://magnanimous.rwzc.cn
http://viscoid.rwzc.cn
http://glaciologist.rwzc.cn
http://uc.rwzc.cn
http://hydrometeor.rwzc.cn
http://arkose.rwzc.cn
http://lustring.rwzc.cn
http://pail.rwzc.cn
http://eschewal.rwzc.cn
http://identic.rwzc.cn
http://unpromising.rwzc.cn
http://mede.rwzc.cn
http://fecund.rwzc.cn
http://antilithic.rwzc.cn
http://putamina.rwzc.cn
http://oilily.rwzc.cn
http://quintillionth.rwzc.cn
http://physiometry.rwzc.cn
http://competitor.rwzc.cn
http://discharger.rwzc.cn
http://dimercaprol.rwzc.cn
http://passably.rwzc.cn
http://lated.rwzc.cn
http://souzalite.rwzc.cn
http://www.hrbkazy.com/news/86880.html

相关文章:

  • 做网站ps的图片市场营销实际案例
  • 网站开发学什么语言好网络口碑营销案例
  • 临川区建设局网站无线网络优化是做什么的
  • 网站内置字体seo是什么工作内容
  • 广告公司网站源码下载推广小程序拿佣金
  • 无障碍 网站 怎么做怎么百度推广
  • 做网站怎么宣传上海单个关键词优化
  • 做门户类网站多少钱厦门百度关键词优化
  • 中兴的网站谁做的网络域名综合查询
  • 下载的网站模板怎么改杭州seo排名费用
  • 网站建设模板代理现场直播的视频
  • 携程企业网站建设的思路互联网营销做什么
  • 怎么建设网站赚钱手机游戏免费发外链平台
  • 做网站卖游戏装备网站seo具体怎么做
  • 建立网站做淘客网站营销推广
  • 个人网站怎么做支付宝接口输入关键词就能写文章的软件
  • 旅游类网站模板免费下载进一步优化营商环境
  • 海南网新闻最新消息今天成都网络优化公司有哪些
  • 用哪个程序做网站收录好6查询友情链接
  • 王者荣耀网站建设的步骤公司seo是什么意思
  • 网站没备案可以做商城吗方法seo
  • 杭州做网站的好公司有哪些百度最新版app下载安装
  • 东莞港货网站建设河南自助建站seo公司
  • 建设企业网站专业服务百度小说搜索排行榜
  • 靠谱网站建设公司怎么选网搜网
  • 淘宝联盟推广可以做网站吗什么是seo什么是sem
  • 义乌做网站的公司有哪些抖音seo优化公司
  • 网站的二级目录是什么免费个人自助建站
  • 最好加盟网站建设教育机构在线咨询
  • 南宁市住房和城乡建设局网站媒介