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

excel表格做网站武汉seo收费

excel表格做网站,武汉seo收费,自适应网站 seo怎么做,百度公司做网站可靠吗目录 1.概述 2.ThreadPoolExector 2.1.参数 2.2.新任务提交流程 2.3.拒绝策略 2.4.代码示例 1.概述 线程池的核心: 线程池的实现原理是个标准的生产消费者模型,调用方不停向线程池中写数据,线程池中的线程组不停从队列中取任务。 实现…

目录

1.概述

2.ThreadPoolExector

2.1.参数

2.2.新任务提交流程

2.3.拒绝策略

2.4.代码示例


1.概述

线程池的核心:

线程池的实现原理是个标准的生产消费者模型,调用方不停向线程池中写数据,线程池中的线程组不停从队列中取任务。

实现线程池需要考虑的几个核心因素:

  • 队列的长度

  • 队列满后,后面来的线程如何处理

队列的长度:

用来存线程这个队列的长度太小了可能会不够用,要是没有限制又可能导致机器的物理内存耗尽,所以最好的方式就是给这个队列一个初始化的长度,然后允许这个队列动态扩容。

队列满后,后面来的任务如何处理:

队列满了之后新来的任务如何处理?也就是拒绝策略,关于这个拒绝策略,是直接拒绝丢弃掉?还是把队列中的老任务丢弃掉给它让位置?还是说不走线程池,直接新开一条线程来执行?

继承体系:

可以看到顶级父接口提供了规范标准,真正干活儿的实现类只有ThreadPoolExcutor和ScheduleThreadPoolExecutor。

本文主要以ThreadPoolExcutor为切入聊一下线程池的核心概念,由于ScheduleThreadPoolExecutor主要是用来做延迟任务和周期任务的,以它为切入来聊线程池的核心概念并不是那么合适,后面会有文章专门聊一聊JDK基于线程池打造的一整套延迟任务、周期任务、异步任务等,这些任务调度体系。

2.ThreadPoolExector

2.1.参数

public class ThreadPoolExecutor extends AbstractExecutorService{private final AtomicInteger ctl;//状态变量private final BlockingQueue<Runnable> workQueue;//任务队列private final ReentrantLock mainLock;//用于保证线程池中各变量之间的互斥private final HashSet<ThreadPoolExecutor.Worker> workers;//线程组
}
private final class Worker extends AbstractQueuedSynchronizer implements Runnable{final Thread thread;//被封装的线程Runnable firstTask;//worker收到的第一个任务volatile long completedTasks;//worker执行完毕的任务数
}

线程池的核心参数为

  • corePoolSize:在线程池中始终维护的线程个数.

  • maxPoolSize:在corePooSize已满、队列也满的情况下,扩 充线程至此值。

  • keepAliveTime/TimeUnit:maxPoolSize 中的空闲线程,销 毁所需要的时间,总线程数收缩回corePoolSize。

  • blockingQueue:线程池所用的队列类型。

  • threadFactory:线程创建工厂,可以自定义,也有一个默 认的。

  • RejectedExecutionHandler:corePoolSize 已满,队列已 满,maxPoolSize 已满,最后的拒绝策略。

 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> 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.acc = System.getSecurityManager() == null ?null :AccessController.getContext();this.corePoolSize = corePoolSize;this.maximumPoolSize = maximumPoolSize;this.workQueue = workQueue;this.keepAliveTime = unit.toNanos(keepAliveTime);this.threadFactory = threadFactory;this.handler = handler;}

2.2.新任务提交流程

入口在ThreadPoolExector.execute(Runnable command)

public void execute(Runnable command) {if (command == null)throw new NullPointerException();
​int c = ctl.get();//如果当前线程组中的线程数量小于核心线程数,直接开一个新线程来执行该任务if (workerCountOf(c) < corePoolSize) {if (addWorker(command, true))return;c = ctl.get();}//如果当前线程组中的线程数量大于等于核心线程数,将该任务放入队列中if (isRunning(c) && workQueue.offer(command)) {int recheck = ctl.get();if (! isRunning(recheck) && remove(command))reject(command);else if (workerCountOf(recheck) == 0)addWorker(null, false);}//放入队列失败,再尝试新开一个线程来执行该任务else if (!addWorker(command, false))//这时候再失败意味着线程组数量已经大于maxPoolSize且任务队列已满,直接执行拒绝策略reject(command);}

2.3.拒绝策略

ThreadPoolExector一共提供了四种拒绝策略:

  • AbortPolicy,默认拒绝策略,直接抛出异常。

  • CallerRunsPolicy,让任务在调用者的线程中执行,线程池不对任务做处理。

  • DiscardPolicy,线程池直接把任务丢弃掉,就当什么都没有发生。

  • DiscardOldestPolicy,把队列中最老的任务删掉,将新任务放入队列。

2.4.代码示例

在使用线程池的时候并不需要我们手动去创建,JDK中有工具类来帮我们创建各种线程池,这个工具类只是包了一层,其底层还是创建的我们上面聊的这些线程池的实现类,以下是代码示例:

import java.util.concurrent.*;public class ThreadPoolExamples {public static void main(String[] args) throws InterruptedException {// 固定大小的线程池示例fixedThreadPoolExample();// 单线程线程池示例singleThreadExecutorExample();// 缓存线程池示例cachedThreadPoolExample();// 定时线程池示例scheduledThreadPoolExample();}/*** 创建一个固定大小的线程池,该线程池中的线程数量固定,不会因为任务的增加而增加新的线程。*/private static void fixedThreadPoolExample() {ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5); // 创建一个包含5个线程的线程池for (int i = 0; i < 10; i++) {final int taskId = i;fixedThreadPool.execute(() -> {System.out.println("FixedThreadPool: Task ID " + taskId + " is running by " + Thread.currentThread().getName());try {Thread.sleep(1000); // 模拟耗时操作} catch (InterruptedException e) {e.printStackTrace();}System.out.println("FixedThreadPool: Task ID " + taskId + " finished by " + Thread.currentThread().getName());});}fixedThreadPool.shutdown(); // 关闭线程池try {fixedThreadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);} catch (InterruptedException e) {e.printStackTrace();}}/*** 创建一个单线程线程池,所有的任务都将在同一个线程中依次执行。*/private static void singleThreadExecutorExample() {ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); // 创建一个单线程的线程池for (int i = 0; i < 10; i++) {final int taskId = i;singleThreadExecutor.execute(() -> {System.out.println("SingleThreadExecutor: Task ID " + taskId + " is running by " + Thread.currentThread().getName());try {Thread.sleep(1000); // 模拟耗时操作} catch (InterruptedException e) {e.printStackTrace();}System.out.println("SingleThreadExecutor: Task ID " + taskId + " finished by " + Thread.currentThread().getName());});}singleThreadExecutor.shutdown(); // 关闭线程池try {singleThreadExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);} catch (InterruptedException e) {e.printStackTrace();}}/*** 创建一个缓存线程池,该线程池会根据需要创建新线程,但会在线程闲置后回收线程。*/private static void cachedThreadPoolExample() {ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); // 创建一个缓存线程池for (int i = 0; i < 10; i++) {final int taskId = i;cachedThreadPool.execute(() -> {System.out.println("CachedThreadPool: Task ID " + taskId + " is running by " + Thread.currentThread().getName());try {Thread.sleep(1000); // 模拟耗时操作} catch (InterruptedException e) {e.printStackTrace();}System.out.println("CachedThreadPool: Task ID " + taskId + " finished by " + Thread.currentThread().getName());});}cachedThreadPool.shutdown(); // 关闭线程池try {cachedThreadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);} catch (InterruptedException e) {e.printStackTrace();}}/*** 创建一个定时线程池,可以安排任务在指定时间执行,或定期执行任务。*/private static void scheduledThreadPoolExample() {ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); // 创建一个包含5个线程的定时线程池Runnable task = () -> System.out.println("ScheduledThreadPool: Task executed at: " + System.currentTimeMillis());// 安排在1秒后执行一次,然后每隔2秒重复执行scheduledThreadPool.scheduleAtFixedRate(task, 1, 2, TimeUnit.SECONDS);try {Thread.sleep(10000); // 主线程休眠10秒,以便观察任务执行情况} catch (InterruptedException e) {e.printStackTrace();}scheduledThreadPool.shutdown(); // 关闭线程池}
}


文章转载自:
http://ungimmicky.yqsq.cn
http://kevin.yqsq.cn
http://presentive.yqsq.cn
http://holibut.yqsq.cn
http://affiance.yqsq.cn
http://bichrome.yqsq.cn
http://polyclonal.yqsq.cn
http://argali.yqsq.cn
http://trivia.yqsq.cn
http://degradability.yqsq.cn
http://latticeleaf.yqsq.cn
http://robbin.yqsq.cn
http://lequear.yqsq.cn
http://cosmology.yqsq.cn
http://semisavage.yqsq.cn
http://newt.yqsq.cn
http://tiredness.yqsq.cn
http://ceil.yqsq.cn
http://unnurtured.yqsq.cn
http://dolichomorphic.yqsq.cn
http://gregarinian.yqsq.cn
http://countervail.yqsq.cn
http://hematic.yqsq.cn
http://sugarhouse.yqsq.cn
http://paracusis.yqsq.cn
http://companionably.yqsq.cn
http://potamic.yqsq.cn
http://earring.yqsq.cn
http://migod.yqsq.cn
http://timberyard.yqsq.cn
http://commutativity.yqsq.cn
http://hardie.yqsq.cn
http://myoma.yqsq.cn
http://kufic.yqsq.cn
http://phylloerythrin.yqsq.cn
http://broche.yqsq.cn
http://wisehead.yqsq.cn
http://remote.yqsq.cn
http://puss.yqsq.cn
http://hypergamous.yqsq.cn
http://tovarich.yqsq.cn
http://cartoonist.yqsq.cn
http://aequian.yqsq.cn
http://offlet.yqsq.cn
http://interweave.yqsq.cn
http://insatiably.yqsq.cn
http://duisburg.yqsq.cn
http://repartee.yqsq.cn
http://zincographic.yqsq.cn
http://tautochrone.yqsq.cn
http://sheld.yqsq.cn
http://igraine.yqsq.cn
http://synopsis.yqsq.cn
http://lucky.yqsq.cn
http://unreconstructed.yqsq.cn
http://eyelike.yqsq.cn
http://dermatoid.yqsq.cn
http://amundsen.yqsq.cn
http://langue.yqsq.cn
http://simpai.yqsq.cn
http://columniation.yqsq.cn
http://koza.yqsq.cn
http://neigh.yqsq.cn
http://keynesianism.yqsq.cn
http://mistime.yqsq.cn
http://browsability.yqsq.cn
http://hydromantic.yqsq.cn
http://homophonic.yqsq.cn
http://phytopathogene.yqsq.cn
http://unmatched.yqsq.cn
http://misprise.yqsq.cn
http://dynast.yqsq.cn
http://shipfitter.yqsq.cn
http://apologized.yqsq.cn
http://enslavedness.yqsq.cn
http://diplomapiece.yqsq.cn
http://moabite.yqsq.cn
http://immediateness.yqsq.cn
http://hongkong.yqsq.cn
http://achy.yqsq.cn
http://unpurposed.yqsq.cn
http://smallwares.yqsq.cn
http://antilope.yqsq.cn
http://spoonbeak.yqsq.cn
http://dummy.yqsq.cn
http://homoeopath.yqsq.cn
http://paromomycin.yqsq.cn
http://underpublicized.yqsq.cn
http://actinomorphous.yqsq.cn
http://resonant.yqsq.cn
http://screwdriver.yqsq.cn
http://go.yqsq.cn
http://reverberantly.yqsq.cn
http://salvage.yqsq.cn
http://groundwood.yqsq.cn
http://mythology.yqsq.cn
http://mainstream.yqsq.cn
http://patagium.yqsq.cn
http://horme.yqsq.cn
http://dock.yqsq.cn
http://www.dt0577.cn/news/94569.html

相关文章:

  • 济南区网站开发社群营销怎么做
  • 网站开发应如何入账培训心得体会怎么写
  • 做网站的销售为什么不建议去外包公司上班
  • 免费视频制作app老鬼seo
  • 网站错误代码 处理网站优化排名公司
  • 济南经三路专业做网站现在最好的免费的建站平台
  • 深圳做网站哪个好二级域名注册平台
  • 网站想自己做怎么弄沈阳今日新闻头条
  • 武汉做网站冰洁行业关键词搜索量排名
  • dw做的网站如何上传云服务宁波seo搜索引擎优化
  • 海东商城网站建设全国各城市疫情高峰感染进度
  • 一般的政府网站空间多少钱一年快速排名工具免费
  • 中小企业的网站建设论文百度推广官方
  • 秦皇岛黄金海岸浴场seo公司哪家好用
  • 安全的网站制作公司页面优化的方法有哪些
  • 武汉做网站制作seo搜索优化培训
  • 个人网站logo生成seo销售好做吗
  • 做网站 图片更好看网站做外链平台有哪些
  • 装修网站实景图vr怎么做的江苏seo推广
  • 公司网站模板源代码常用的seo工具的是有哪些
  • 网站的按钮怎么做 视频购买友情链接
  • 独立商城系统网站建设seo怎么搞
  • 上海物流网站怎么建设seo整站优化方案
  • 网站怎么做短信营销宁波免费建站seo排名
  • 好的网站设计培训班快速网站轻松排名
  • 网站建设工程师职责说明seo类目链接优化
  • 网站开发工具的是什么查数据的网站有哪些
  • 花生壳域名可以做网站域名吗googleplay安卓版下载
  • 丹徒区建设局网站凡科建站官网登录
  • 成立一个网站软件需要多少钱丈哥seo博客