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

建设网站专家衡水哪儿做wap网站

建设网站专家,衡水哪儿做wap网站,网络服务包括哪些内容,网站建设怎么开发客户为什么要使用线程池? JDK1.5后JUC包添加了线程池相关接口,在Java诞生之初并没有线程池这个概念。刚开始Java程序都是自行创建线程去处理任务。随着应用使用的线程越来越多,JDK开发者们发现有必要使用一个统一的类来管理这些线程,…

为什么要使用线程池?

JDK1.5后JUC包添加了线程池相关接口,在Java诞生之初并没有线程池这个概念。刚开始Java程序都是自行创建线程去处理任务。随着应用使用的线程越来越多,JDK开发者们发现有必要使用一个统一的类来管理这些线程,从而有效提高线程的执行效率,减少创建、销毁线程的开销。

大量线程的创建、销毁是非常消耗资源的。创建线程需要消耗一定的内存、CPU资源,大量的线程也会导致大量的线程上下文切换,上下文切换代码也是相当大的,过多的线程导致频繁切换更是可能使系统性能急速下降。另外操作系统对每个进程能创建的线程数也是有限制的,不可能无限创建。但是大量任务也不可能只在主线程处理吧,这样也太慢了。比如下面的例子,创建上万的线程,每个线程打印一下线程名字,观察一下任务管理器,CPU直接用完。这只是简单的任务,要是复杂长时间的任务,整个操作系统可能都会受到影响(CPU利用率长时间下不来,影响其他程序)

public class BadMultiThreadTest {public static void main(String[] args) {Runnable r = () -> {System.out.println("ThreadName-" + Thread.currentThread().getName());};//过多创建线程导致系统资源消耗严重for (int i = 0; i < 10000; i++) {Thread thread = new Thread(r);thread.start();}}
}

线程池就是为了解决上述问题出现的,解决问题的思路很清晰,就是创建好一定数量的线程,有任务来了就用这些线程来执行任务,任务过多把池里面的线程都占用了就放队列排队等候其他任务执行,一旦有空闲线程就可以从队列里面取出任务并执行。有了可控的线程池,系统就不会处于一种可能随时被大量并发导致线程大量创建,最终压跨系统的危险中。

如何使用线程池?

使用线程池去改造上面的例子:

public class MultiThreadPoolTest {public static void main(String[] args) {ExecutorService executorService = Executors.newFixedThreadPool(10);for (int i = 0; i < 10000; i++) {executorService.execute(() -> {System.out.println("ThreadName-" + Thread.currentThread().getName());});}}
}

这次再观察任务管理器,这次CPU占用不会说飙长,而是相对平稳。打印的线程名称就是在ThreadName-pool-1-thread-1到ThreadName-pool-1-thread-10之间变化,说明这一万个任务都是这10个线程处理的。 

线程池的参数含义

上面的例子简单的使用了Excutors工具类来创建了一个固定线程数的线程池。这个工具类还可以创建单线程线程池、可缓存线程池、定时执行任务的线程池等。这些线程池的创建事实上都是在创建一个ThreadPoolExecutor实例,只是通过传递不同参数,实现不同的线程池效果而已。如果我们把里面的参数都搞明白,我们就可以根据实际需求去自定义线程池,实际开发中,我们都应该使用自定义的线程池去处理相关业务,这样能最大提高线程池使用效率,提高系统性能。当然,这还得靠我们对业务的理解,从而定义出合理的线程池。

通过下面这句代码,跟踪源码

Executors.newFixedThreadPool(10);

最终调用的函数如下,它包含了线程池的所有参数注释:

    /*** Creates a new {@code ThreadPoolExecutor} with the given initial* parameters.** @param corePoolSize the number of threads to keep in the pool, even*        if they are idle, unless {@code allowCoreThreadTimeOut} is set* @param maximumPoolSize the maximum number of threads to allow in the*        pool* @param keepAliveTime when the number of threads is greater than*        the core, this is the maximum time that excess idle threads*        will wait for new tasks before terminating.* @param unit the time unit for the {@code keepAliveTime} argument* @param workQueue the queue to use for holding tasks before they are*        executed.  This queue will hold only the {@code Runnable}*        tasks submitted by the {@code execute} method.* @param threadFactory the factory to use when the executor*        creates a new thread* @param handler the handler to use when execution is blocked*        because the thread bounds and queue capacities are reached* @throws IllegalArgumentException if one of the following holds:<br>*         {@code corePoolSize < 0}<br>*         {@code keepAliveTime < 0}<br>*         {@code maximumPoolSize <= 0}<br>*         {@code maximumPoolSize < corePoolSize}* @throws NullPointerException if {@code workQueue}*         or {@code threadFactory} or {@code handler} is null*/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;}

 下面简单总结一下参数的含义:

参数名称含义
corePoolSize
核心线程数
maximumPoolSize
最大线程数
keepAliveTime+时间单位
空闲线程存活时间
workQueue
任务队列
threadFactory
创建线程的工厂类
handler
被拒绝任务处理器

线程池处理任务的流程

看一下下面的流程图就能清晰知道任务从被提交再到被线程池中线程执行的流程了。

 如上流程图,任务被提交后,线程池会检查核心线程数是否满了,如果不是,则会创建一条核心线程以执行该任务。如果满了,则把任务放到阻塞队列中,等待有空闲的核心线程来执行任务。阻塞队列如果也满了,则需要检查最大核心线程数是否满了,如果没满,创建非核心线程以执行任务,如果满了,表示线程池再也没能力去处理该任务了,则需要拒绝策略做处理。注意到构建线程池的参数中有keepAliveTime+时间单位这两个参数,这两个参数正是用于回收非核心线程用的,当非核心线程没任务了,空闲时间达到keepAliveTime配置的值后将会被线程池销毁以回收一些系统资源。

使用线程池的优点

根据上面可以简略总结出使用线程池的几点优点:

  • 解决线程创建、销毁等生命周期系统消耗过大问题。因为线程池中的线程一旦创建过,核心线程是会一直驻留在池中待用的,这样任务来了后,直接可以执行,消除了创建线程的系统开销。系统响应更及时,使用更丝滑。
  • 线程池使得系统可控性更强。它避免了系统资源使用不当导致系统崩溃,能更合理的使用CPU和内存资源。

http://www.cairui.net.cn/news/421/

相关文章:

  • 域名注册网站制作临沂网站设计培训班
  • 做网站应该会什么wordpress 链接转换
  • 中亿丰建设集团股份有限公司网站企业型网站开发
  • 网站宣传专利被罚做网站要建立站点吗
  • 河南夏邑网站建设seo的中文意思是什么
  • 保定网站建设方案报价电商类网页设计
  • 陕西网站建设哪家好python 做网站很快吗
  • 建网站需要钱吗wordpress多种筛选
  • 内网电脑做网站网站建设行业标准
  • 景泰做网站全国酒店网站建设
  • 长春网站建设长春wordpress媒体库域名
  • 服装设计网站免费让百度收入 wordpress
  • 免费行情软件网站下载视频吉林省建设信息网官网
  • 做网站做域名千阳县住房和城乡建设局网站
  • 国外免费空间建网站免费建网站软件下载手机
  • 如何注册网站卖东西vs网站中的轮播怎么做
  • 广播电台网站建设板块wordpress如何设置分类目录
  • 临沂网站建设推荐中国万网域名查询
  • 网站团购报名怎么做腾讯街景地图实景下载
  • 都匀市城乡建设局网站河北建设安装工程有限公司怎么样
  • 怎么建立一个网站朝阳 手机网站 建设
  • 创办一个网站需要多少费用济南房产查询网官网
  • 10个网站用户体验优化的研究结果wordpress图片页
  • 平台网站建设公司哪家好网站不提交表单
  • 网站建设培训教程无极网站网站
  • 网站服务器要求php网站开发工程师教程
  • 网站后台视频装饰公司网站
  • 单位网站怎么制作国外 网站源码
  • 个人音乐网站免费建设旅游类网站设计模板下载
  • 沧州网站建设哪家专业中国网络经纪人