2026/1/8 7:40:50
网站建设
项目流程
建大网站首页,长春企业模板建站,携程网站建设状况,国内大型免费网站建设池/线程池是什么
虽然创建销毁线程比创建销毁进程更轻量#xff0c;但是频繁创建销毁线程必然会导致效率的下降。
于是有了池这样的概念#xff0c;池的概念可以类比于备用物品/资源#xff0c;就像备胎一样#xff0c;需要他的时候就可以使用#xff0c;不需要的时候就是…池/线程池是什么虽然创建销毁线程比创建销毁进程更轻量但是频繁创建销毁线程必然会导致效率的下降。于是有了池这样的概念池的概念可以类比于备用物品/资源就像备胎一样需要他的时候就可以使用不需要的时候就是闲置状态。而线程池就是为了解决频繁创建销毁带来的低效率。如果某个线程不再使用了并不是真正把线程释放而是放到一个池里留着备用这样一来下次如果需要用到线程就直接从池子中取不必通过系统来创建了。标准库中的线程池在标准库中我们通过ExecutorService来创建一个线程池实例从ExecutorService进而延伸出两种创建线程池的方式。第一种通过Executors工厂类来创建出几种不同风格的线程池什么是工厂类这里我觉得有一个词“预制”很好来形容工厂类在编程中预制本质是提前封装资源、逻辑或组件减少重复开发提高效率。就像一个一套提前准备好的模版一样你需要的时候直接去套模版就可以提高效率Executors又可以延伸出创建线程池的几种方式分别是newFixedThreadPool创建固定线程数的线程池newCachedThreadPool创建线程数目动态增长的线程池newSingleThreadExecutor创建只包含单个线程的线程池newScheduledThreadPool设定 延迟时间后执行命令或者定期执行命令在创建好的实例中我们用submit方法来向线程池里添加要执行的内容/任务ExecutorServiceserviceExecutors.newFixedThreadPool(4);service.submit(newRunnable(){Overridepublicvoidrun(){}});ExecutorServiceservice2Executors.newCachedThreadPool();service2.submit(newRunnable(){Overridepublicvoidrun(){System.out.println(pool);}});ExecutorServiceservice3Executors.newSingleThreadExecutor();service3.submit(newRunnable(){Overridepublicvoidrun(){System.out.println(pool);}});ExecutorServiceservice4Executors.newScheduledThreadPool(4);service4.submit(newRunnable(){Overridepublicvoidrun(){System.out.println(pool);}});第二种创建ExecutorService实例的方式就是ThreadPoolExecutorThreadPoolExecutor 提供了更多的可选参数可以进一步细化线程池行为的进行定制。ThreadPoolExecutor的构造方法提供了很多参数这里我们重点来解析一下相关的参数我们拿参数最多的最后一个来说这里我们把创建一个线程池想象成开个公司. 每个员工相当于一个线程corePoolSize正式员工的数量(正式员工一旦录用永不辞退)maximumPoolSize正式员工 临时工的数目(临时工一段时间不干活就被辞退)keepAliveTime临时工允许的空闲时间unitkeepAliveTime的单位workQueue传递任务的阻塞队列Runnable的容器threadFactory: 创建线程的工厂参与具体的创建线程工作RejectedExecutionHandler⚠️四个重要的拒绝策略如果任务量超出公司的负荷了接下来怎么处理AbortPolicy()超过负荷直接抛出异常现有的任务和新的任务都不处理了CallerRunsPolicy()新添加进来的任务由添加任务的人/线程来处理不影响现有的任务DiscardOldestPolicy()丢弃所有任务中最老的任务将新的任务安排到最老的任务位置来处理DiscardPolicy()丢弃新来的任务维持现状不抛出异常不影响现有的任务模拟实现这里模拟实现就以newFixedThreadPool这样固定大小的线程池来举例前面使用ExecutorService的实例的时候执行完任务之后没有立马终止线程所以这里应该使用阻塞队列来放任务publicclassMyThreadPool{privatefinalBlockingQueueRunnablequeuenewArrayBlockingQueue(100);publicMyThreadPool(intn){for(inti0;in;i){ThreadtnewThread(()-{while(true){try{Runnablerunnablequeue.take();runnable.run();}catch(InterruptedExceptione){thrownewRuntimeException(e);}}});t.start();}}publicvoidsubmit(Runnablerunnable)throwsInterruptedException{queue.put(runnable);}}这里我们写一个简单的循环来模拟线程池处理任务的效果classMain{publicstaticvoidmain(String[]args)throwsInterruptedException{MyThreadPoolmyThreadPoolnewMyThreadPool(3);for(inti0;i1000;i){intni;myThreadPool.submit(newRunnable(){Overridepublicvoidrun(){System.out.println(执行任务n 当前线程为Thread.currentThread().getName());}});}}}效果和前面标准库里的newFixedThreadPool一样