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

在网站做的pdf有水印如何删除网站栏目词

在网站做的pdf有水印如何删除,网站栏目词,wordpress模板 物流,设置网站建设方案文章目录 #x1f490;线程池概念以及什么是工厂模式#x1f490;标准库中的线程池#x1f490;什么是工厂模式#xff1f;#x1f490;ThreadPoolExecutor#x1f490;模拟实现线程池 #x1f490;线程池概念以及什么是工厂模式 线程的诞生是因为#xff0c;频繁的创… 文章目录 线程池概念以及什么是工厂模式标准库中的线程池什么是工厂模式ThreadPoolExecutor模拟实现线程池 线程池概念以及什么是工厂模式 线程的诞生是因为频繁的创建进程太重量了(开销较大),所以引入了线程但是呢对于线程来讲如果更加频繁的创建和销毁那么开销也会慢慢的变大所以又引入了两种经典的方法来进一步提高 1.协程又称为轻量级线程线程比较轻量是因为线程省略了分配资源的环节而协程它在着基础上又省略了操作系统调度执行的环节由程序员自己调度在Java中呢主要使用线程池所以对于协程只是简单提一下 2.线程池 举一个例子 假如我是一个很漂亮的妹子又有许多的男生正在追我然后我就选择了一个男生A做我男朋友但是呢经过一段时间之后我就腻了就想要和男生B谈恋爱所以我就和男生A提出了分手然后和男生B培养感情等到有了感情基础等有了感情基础后就拿下男生B但是过来一段时间后我又想和男生C谈恋爱所以就接着重复上面的套路先培养感情等等……… 而对于上面这种换男朋友的方式感觉效率太慢所以我就有了一种新的方式在和男生A谈恋爱的同时偷偷的和男生B、C、D等多个男生培养感情等到我向和谁谈恋爱时那不就是捅破一层窗户纸的事情么就可以挑选一个直接谈恋爱这样的效率不久高了很多么所以对于偷偷的和我培养感情的这群男生也就可以称为“备胎池” 而我们的线程池也是上面这种模式在向池中添加任务时直接从线程池中拿线程就可以了就不比再创建了直接拿过来使用即可这样也就降低了线程创建的开销所以线程池的就是先把线程创建好放进池子里等到后续想要使用时直接从池子里取 这里就会有一个问题为啥从线程池里面取线程比创建线程效率高 首先创建新的线程这个动作是内核态用户态相互配合完成的 而从线程池中取这个动作是用户态操作完成的 所以这里就涉及到了两个新名词什么是用户态什么是内核态 如果一段程序是在系统内核中完成的此时就称为内核态 如果不是则称为用户态 而操作系统呢是由内核配套的应用程序组成的创建线程就需要调用系统API,进入到内核中按照内核态的方式来完成一系列的动作 但是为什么内核态操作的效率比较低呢请看下图 标准库中的线程池 在Java中提供了一个类——Executors创建线程池但是线程池对象的创建并不是直接new出来的而是通过一个方法的返回值返回了一个线程池对象 public class MyThreadPool {public static void main(String[] args) {//创建一个动态的线程池ExecutorService es Executors.newCachedThreadPool();es.submit(new Runnable() {Overridepublic void run() {System.out.println(hello);}});} }创建线程池对象分为以下步骤 1.使用Executors.newCachedThreadPool 创建出一个动态增长的线程池为什么要用Executors.newCachedThreadPool的方式创建线程池而不是直接new Executors这里就涉及到了一个设计模式——工厂模式 什么是工厂模式 工厂模式定义一个工厂类通过调用工厂类中的不同方法来实现对象的实例化从而创建出不同作用的对象 举个例子我们在创建对象时会使用new关键字通过构造方法来创建对象但是使用构造方法创建对象会又很大的局限性举个例子假如我现在想要使用笛卡尔坐标来创建一个点对象代码如下 public class Point {//笛卡尔坐标系需要提供一个xy坐标private int x;private int y;//通过笛卡尔坐标的方式创建一个对象public Point(int x, int y) {}; }但是我现在又想通过极坐标的方式创建点对象 public class Point {private int x;private int y;//通过笛卡尔坐标的方式创建一个对象public Point(int x, int y) {};//极坐标的方式就需要提供一个半径和角度public Point(int r, int a) {}; }但是以上这种方式就会编译错误因为如果想要使用多种构造方法的方式创建对象的话就需要将构造方法重载而重载的条件是要保证参数列表的类型或者个数不同所以以上代码是行不通过的针对这种问题就可以利用工厂模式解决 public class Point {private int x;private int y;public void setX(int x) {this.x x;}public void setY(int y) {this.y y;} }//创建一个点对象的工厂 class PointFactor{//通过笛卡尔坐标系创建对象public static Point newPointByXY(int x, int y) {Point p new Point();//对Point中的属性进行初始化p.setX(x);p.setY(y); return p;}//通过极坐标创建对象public static Point newPointByRA(int r, int a) {Point p new Point();p.setX(r);p.setY(a);return p;} }//测试类 class Main{public static void main(String[] args) {//这样通过调用点工厂中不同方法就可以根据不同的方式创建出对象Point point1 PointFactor.newPointByXY(5,2);Point point2 PointFactor.newPointByRA(10,20);} }回到这里的线池 public class MyThreadPool {public static void main(String[] args) {//创建一个动态的线程池ExecutorService es Executors.newCachedThreadPool();es.submit(new Runnable() {Overridepublic void run() {System.out.println(hello);}});} }在线程池中也提供了几个比较重要的方法 重点创建线程池也提供了几种不同的方式 newCachedThreadPool() 创建线程数目动态增长的线程池 这种方式创建的线程池池子中的线程会根据你添加的任务的需要自动创建线程出来线程结束以后也不会立即销毁而是会在池子中保留一段时间以备后续再随时使用 newFixedThreadPoll() 创建固定线程数的线程池 newSingleThreadPool() 创建只包含一个线程的线程池 newScheduleThreadPool() 类似于定时器只不过不是一个扫描线程而是多个扫描线程执行时间到的任务 方法的返回值类型是ExecutorService 通过ExecutorService定义的对象调用submit()方法注册一个任务到线程池中 public static void main(String[] args) {//创建一个动态的线程池ExecutorService es1 Executors.newCachedThreadPool();ExecutorService es2 Executors.newFixedThreadPool(5);ExecutorService es3 Executors.newSingleThreadExecutor();ExecutorService es4 Executors.newScheduledThreadPool(6);//指定扫描线程的数量}上述几个使用工厂方法创建的线程池本质上都是对一个类进行了封装这个类就是——ThreadPoolExecutor 这个类的功能非常丰富提供了很多不同参数方法上述的几个工厂方法呢其实就是给这个ThreadPoolExecutor 类填写了不同的构造参数从而创建出了不同的线程池 接下来就看一下ThreadPoolExecutor的使用方法 ThreadPoolExecutor ThreadPoolExecutor的构造方法中提供了很多可选的参数进一步的细化了线程池的设定下面针对这些参数进行一个讲解 上图就是ThreadPoolExecutor的所有构造方法也可以看到最后一个构造方法的参数最多并且当中的参数也都包含了其他三个方法的参数所以这里针对最后一个方法参数进行讲解 int corePoolSize :核心线程数 int maximumPoolSize :最大线程数目 在一个线程池中是有多个线程的以上两个参数就指定了线程池中线程数目的范围最少有corePoolSize个线程最多不会超过maxMumPoolSize个线程 long keepAliveTime 和 TimeUnit unit :空余线程存活的时间以及时间的单位 在创建线程时 默认会先使用核心线程数上面提到过当任务执行结束后线程不会立马销毁而是会有一个保留的时间一方面是为了如果后续再需要使用时就不用再进行创建另一方面是当保留时间到了以后进行销毁也减少了资源消耗后续使用时再进行创建即可 BlockingQueue workQueue 阻塞队列 当使用submit向线程池中添加任务时如果任务个数少于核心线程数那么会创建新的线程去执行任务如果任务个数超过了核心线程数就会先添加到阻塞队列中然后工作线程从队列中取出任务执行如果任务不能排队等候那么也会创建一个新的线程前提是不会超过最大的线程数需要注意的是这里的队列不光可以是阻塞队列还可以是其他的队列例如如果需要使用优先级就可以设置为PriorityBlockingQueue如果任务数目变动不大就可以使用ArrayBlockingQueue如果任务数目变动较大就可以使用LinkedBlockingQueue; ThreadFactory threadFactory 线程工厂类 这个类也是工厂模式的体现由ThreadFactory这个工厂类来创建线程使用工厂类创建线程主要是对线程的属性进行设置通过这个类对这些属性进行了封装就不需要我们手动进行设置 ThreadPoolExecutor.DiscardPolicy 拒绝策略 一个线程池中的线程数量是有上限的当线程数量达到上限后如果还继续往线程池中添加任务那么针对不同的拒绝策略就会出现不同的效果 重点任务策略分为 这四种拒绝策略使用了类来实现想要使用哪种策略直接创建出对象将对象传过去即可 下面针对这四种策略进行一个讲解 ThreadPoolExecutor.AbortPolicy 如果队列已经满了直接抛出异常 ThreadPoolExecutor.CallerRunsPolicy 新添加的任务由调用任务的线程执行 ThreadPoolExecutor.DiscardOldestPolicy 丢弃任务队列中最老的任务 ThreadPoolExecutor.DiscardPolicy 丢弃新添7加的任务 上面讲过针对于线程池可以设置线程的数目但是这个数目设置成多少合适呢 针对这个问题网上有很多的答案假设CPU的逻辑核心数是N线程数目的设置就有多个答案例如 N个N1个N2个2N个等等 针对以上答案没有一个是正确的因为这需要根据项目代码进行设置一个线程执行的代码主要分为两类 CPU 密集型 CPU 密集型代码里面的主要逻辑都是在算数运算/逻辑判断 IO 密集型 IO 密集型代码里面的主要逻辑都是在进行IO操作 如果代码是都是CPU密集型这时设置的线程数目就不能超过N如果代码都是IO密集型的此时设置的线程数目就可以超过N而在现实中没有代码都是纯CPU密集型和纯IO密集型的同时我们也无法知道有多少代码是CPU密集有多少代码是IO密集的 所以要想知道该设置多少线程数正确的做法就是用实验的方式尝试改变线程池中不同线程的数目来观察出哪种数目更合适 模拟实现线程池 这里来模拟一个简单的newFixedThreadPool()版本的线程池步骤 创建一个MyThreadPool,描述一个线程池 使用一个阻塞队列组织所有的任务 public class MyThreadPool {//创建一个阻塞队列组织所有的任务private BlockingDequeRunnable queue new LinkedBlockingDeque();public MyThreadPool(int n) {//创建n个线程for(int i 0; i n; i) {Thread thread new Thread(() - {try {Runnable runnable queue.take();runnable.run();} catch (InterruptedException e) {throw new RuntimeException(e);}});thread.start();}}public void submit(Runnable runnable) throws InterruptedException {queue.put(runnable);}public static void main(String[] args) throws InterruptedException {MyThreadPool myThreadPool new MyThreadPool(4);for(int i 0; i 100; i) {int n i;myThreadPool.submit(new Runnable() {Overridepublic void run() {System.out.println(n);}});}} }
http://www.dnsts.com.cn/news/19836.html

相关文章:

  • 做看电视电影的网站赚钱seo口碑优化
  • 中国做类似 esty的网站网络网站建设价格
  • 西宁商城网站建设公司惠州百度seo哪里强
  • 外部门户网站首页代理注册公司代理费多少钱
  • 个人网站引导页源码临城网站
  • 烟台网站搜索优化黄山seo排名优化技术
  • 做外贸怎么网站找客户会外语和做网站
  • 公司做网站文案怎么写东莞外贸人才网
  • 网站建设费用明细 xls做网站必需要在工商局备案吗
  • 邳州哪家做百度推广网站 在线
  • 企业网站建无极领域付费网站
  • 用文字写美食个人网站设计作品舆情系统源码
  • 查看网站用什么语言做的购物网站模版
  • 济源城乡建设局网站wordpress 淘宝联盟
  • 网站建设礻首选金手指晋州专业网站建设
  • wordpress 数据库查询数据库沈阳seo排名收费
  • 可以自己做漫画的网站生成手机网站
  • 价钱网站建设衡水网站制作与推广
  • 做抽奖网站合法吗网站优化过度被k
  • 淘宝店铺怎么引流推广苏州seo关键字优化
  • 做商城类网站空间怎么买新手学网站建设解疑与技巧1200例
  • 泰州网站制作软件网站制作手机
  • pc三合一网站wordpress固定链接设置静态链接
  • 网站开发进度计划表如何做超市的网站
  • 网站开发者什么浏览器网站推荐入口
  • 做ppt的网站叫什么名字h5网站开发价格
  • 网址收录网站新增网站建设方案
  • 青岛市北建设集团网站渭南网页设计
  • 公司网站搜索引擎优化网站空间名
  • 商标设计网站推荐企业seo如何优化