首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Java线程池(1)

Java线程池(1)

由于系统频繁创建线程和销毁线程成本是比较高的,尤其是需要大量短时间的线程,于是有了线程池,可以很好的提高系统性能。线程池在系统启动时,便创建大量的空闲线程,当将一个Runnable对象传给线程池时,线程池的其中一个线程便执行Runnable对象的run()方法,执行完后,线程并非销毁而是回到线程池进入空间状态,等待下一个任务的到来。线程池可以有效的控制并发线程的数量,不让它超过系统值,而引起的JVM崩溃。        


ThreadPoolExecutor是线程池里最核心的一个类,我们来通过它了解线程池:

ThreadPoolExecutor构造器

可以看出ThreadPoolExecutor类给了4个构造器供我们使用,下面我们来详解构造器的7个参数:

        corePoolSize———该池中的最大核心线程数量,核心线程默认保存在池中,即使是空闲状态的,除非设置了allowCoreThreadTimeOut为true(设置这个后,核心线程闲置一定时间(由下面的参数决定时间)后,就会被销毁掉)。

        maximumPoolSize———允许线程池的最大线程数量(最大线程数量=核心线程数量+非核心线程数量)。

        keepAliveTime———空闲状态下的非核心线程被销毁前等待的时间(核心线程设置了                    allowCoreThreadTimeOut的话同样)。

        unit———keepAliveTime的单位,枚举类型,有7个静态属性:

                TimeUnit.DAYS;              //天

                TimeUnit.HOURS;            //小时

                TimeUnit.MINUTES;          //分钟

                TimeUnit.SECONDS;          //秒

                TimeUnit.MILLISECONDS;      //毫秒

                TimeUnit.MICROSECONDS;      //微妙

                TimeUnit.NANOSECONDS;      //纳秒

        workQueue———用于在执行任务之前使用的队列(就是添加线程任务后,任务进入队列后,不同的队列执行不同的策略),常用的类型有如下几种:

        SynchronousQueue:队列接收到任务,直接提交给线程池处理,不保留它,如果所有线程都在工作了,则新建一个线程来处理这个任务。(线程数超过maximumPoolSize会不能新建线程而报错,一般把maximumPoolSize设置为Integer.MAX_VAULE)

        LinkedBlockingQueue:队列接收到任务,如果当前线程数不超过corePoolSize,既新建核心线程执行这个任务,否则任务入队列等待。

        ArrayBlockingQueue:指定队列的长度,如果当前线程未超过corePoolSize,新建核心线程处理任务,若超过了,则入队列等待,又如果队列已满,则新建非核心线程执行任务,再则总线程数超过了最大线程数,则发生错误。

        DelayQueue:队列内元素必须实现Delayed接口(传入的任务必须先实现Delayed接口),先入队,到指定时间后才执行。

        threadFactory———线程工厂,创建线程的方式。

        handler———抛出异常专用,针对上面出现的异常的处理方式。
返回列表