博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java线程池之newFixedThreadPool定长线程池
阅读量:6364 次
发布时间:2019-06-23

本文共 2775 字,大约阅读时间需要 9 分钟。

newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

线程池的作用:

线程池作用就是限制系统中执行线程的数量。

     根 据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排 队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程池 中有等待的工作线程,就可以开始运行了;否则进入等待队列。

为什么要用线程池:

1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。

2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。

测试代码

package com.ricoh.rapp.deploymenttool.ui.component;import java.util.Date;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class CountdownLatchTest1 {    public static void main(String[] args) {        try {            System.out.println("主线程" + Thread.currentThread().getName() + "等待子线程执行完成...");            ExecutorService service = Executors.newFixedThreadPool(3);            final CountDownLatch latch = new CountDownLatch(3);            for (int i = 0; i < 8; i++) {                Runnable runnable = new Runnable() {                    @Override                    public void run() {                        try {                            System.out.println("子线程" + Thread.currentThread().getName() + "开始执行" + new Date().getTime());                            Thread.sleep(50000);                            System.out.println("子线程" + Thread.currentThread().getName() + "执行完成" + new Date().getTime());                            latch.countDown(); // 当前线程调用此方法,则计数减一                        } catch (InterruptedException e) {                            e.printStackTrace();                        }                    }                };                service.execute(runnable);            }            /*阻塞第一批次的任务,直到第一批次的每个线程都执行完毕才会执行下面的代码;             * 第一批次如果有执行玩的会开始第二批次的任务,所以会存在第一二批次任务混合的情况             * */            latch.await(); // 阻塞当前线程,直到计时器的值为0            System.out.println("主线程" + Thread.currentThread().getName() + "开始执行...");        } catch (Exception e) {            e.printStackTrace();        }    }    /*     * console:     * 主线程main等待子线程执行完成...    子线程pool-1-thread-2开始执行1558941022561    子线程pool-1-thread-1开始执行1558941022561    子线程pool-1-thread-3开始执行1558941022561    子线程pool-1-thread-3执行完成1558941072565    子线程pool-1-thread-2执行完成1558941072565    子线程pool-1-thread-3开始执行1558941072565    子线程pool-1-thread-1执行完成1558941072565    子线程pool-1-thread-2开始执行1558941072565    主线程main开始执行...    子线程pool-1-thread-1开始执行1558941072565    子线程pool-1-thread-3执行完成1558941122572    子线程pool-1-thread-1执行完成1558941122572    子线程pool-1-thread-1开始执行1558941122572    子线程pool-1-thread-2执行完成1558941122572    子线程pool-1-thread-3开始执行1558941122572    子线程pool-1-thread-3执行完成1558941172580    子线程pool-1-thread-1执行完成1558941172580*/    }

 参考:

转载于:https://www.cnblogs.com/wang-liang-blogs/p/10931286.html

你可能感兴趣的文章
Scala使用隐式转换进行比较
查看>>
mysql 数据库 (基础) 笔记
查看>>
将Mysql的一张表导出至Excel格式文件
查看>>
监听Android系统截屏
查看>>
Oracle三大经典表连接适用情况
查看>>
一个ajax请求,接收json数据
查看>>
359. Logger Rate Limiter - Easy
查看>>
[Programming Entity Framework] 第2章 探究实体数据模型(EDM)(一)
查看>>
DispatcherHelper
查看>>
read命令
查看>>
hadoop安装
查看>>
iOS UICollectionView简单使用
查看>>
centos 6.3 源码安装mysql
查看>>
小笔记----about JC
查看>>
sqlserver 获得行号作为唯一id
查看>>
.NET工作准备--04ASP.NET
查看>>
【SpringCloud微服务实战学习系列】创建应用及解析
查看>>
877E - Danil and a Part-time Job
查看>>
Linux环境下安装 ElasticHD
查看>>
mysql进阶(十三)命令行导出导入数据库
查看>>