博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程简单实例(3)线程池
阅读量:4462 次
发布时间:2019-06-08

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

为什么要用线程池?

每次用线程的时候都去new一个,不麻烦么。如果线程用到较少可以。当需要大量用到线程时,频繁的创建线程,而且创建线程和销毁带来的开销也会随之增多。

线程池就像一个执行器。而我们需要执行的业务逻辑,在我们编写的实现了Runnable接口的run方法里面。

需要执行就扔到线程池里,我只要保证我的业务逻辑在run里面已经实现了。执行找线程池这个代工。

线程池ThreadPoolExecutor类,下面是该类的构造方法。

public class ThreadPoolExecutor extends AbstractExecutorService {    .....    public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,            BlockingQueue
workQueue); public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue
workQueue,ThreadFactory threadFactory); public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue
workQueue,RejectedExecutionHandler handler); public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue
workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler); ...}

主要参数介绍:

corePoolSize:核心线程数
maximumPoolSize:最大线程数(可以想象成cpu中的超超频)
keepAliveTime:线程无任务存活时间(一般情况下,当前线程数poolSize大于corePoolSize时,会销毁空闲时间大于keepAliveTime的线程,直到当前线程数不大于corePoolSize)
unit:keepAliveTime的单位(
TimeUnit.DAYS;               //天TimeUnit.HOURS;             //小时TimeUnit.MINUTES;           //分钟TimeUnit.SECONDS;           //秒TimeUnit.MILLISECONDS;      //毫秒TimeUnit.MICROSECONDS;      //微妙TimeUnit.NANOSECONDS;       //纳秒
) BlockingQueue
:缓存队列中允许最大的任务线程数(当线程数大于maxnumPoolSize时,将加入到缓存队列中)
ThreaPoolExecutor的一些方法: execute():线程池加入线程 submit():线程池加入线程(和execute方法一样,只不过会返回一个参数。ps:其实submit内部也是调用了execute方法) shutdown():关闭线程池(若线程池和缓存中还有未执行完的线程,则会继续执行,执行完清空线程池。) shutdownNow():马上关闭线程池(若线程池中还有未执行完的线程,则会抛出异常) 简单的例子:
package code.thread;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;//线程池public class ThreadPool {    public static void main(String[] args) {        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 10, 200, TimeUnit.MICROSECONDS,                 new ArrayBlockingQueue
(5)); for(int i=0;i<15;i++){ threadPool.execute(new Task(i)); System.out.println("线程池中的线程数:"+threadPool.getPoolSize()+" 队列中等待的线程数:"+ threadPool.getQueue().size()+" 已执行完的线程数:"+threadPool.getCompletedTaskCount()); } { try { Thread.sleep(5000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("线程池中的线程数:"+threadPool.getPoolSize()+" 队列中等待的线程数:"+ threadPool.getQueue().size()+" 已执行完的线程数:"+threadPool.getCompletedTaskCount()); } threadPool.shutdown(); }}class Task implements Runnable { private int i; public Task(int i) { this.i = i; } @Override public void run() { System.out.println("task:"+i+"执行"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("task:"+i+"执行结束"); } }

执行结果:

task:0执行

线程池中的线程数:1 队列中等待的线程数:0 已执行完的线程数:0
线程池中的线程数:2 队列中等待的线程数:0 已执行完的线程数:0
task:1执行
线程池中的线程数:3 队列中等待的线程数:0 已执行完的线程数:0
task:2执行
线程池中的线程数:4 队列中等待的线程数:0 已执行完的线程数:0
task:3执行
线程池中的线程数:5 队列中等待的线程数:0 已执行完的线程数:0
task:4执行
线程池中的线程数:5 队列中等待的线程数:1 已执行完的线程数:0
线程池中的线程数:5 队列中等待的线程数:2 已执行完的线程数:0
线程池中的线程数:5 队列中等待的线程数:3 已执行完的线程数:0
线程池中的线程数:5 队列中等待的线程数:4 已执行完的线程数:0
线程池中的线程数:5 队列中等待的线程数:5 已执行完的线程数:0
线程池中的线程数:6 队列中等待的线程数:5 已执行完的线程数:0
task:10执行
线程池中的线程数:7 队列中等待的线程数:5 已执行完的线程数:0
task:11执行
task:12执行
线程池中的线程数:8 队列中等待的线程数:5 已执行完的线程数:0
线程池中的线程数:9 队列中等待的线程数:5 已执行完的线程数:0
task:13执行
task:14执行
线程池中的线程数:10 队列中等待的线程数:5 已执行完的线程数:0
task:0执行结束
task:2执行结束
task:5执行
task:1执行结束
task:6执行
task:3执行结束
task:8执行
task:4执行结束
task:9执行
task:13执行结束
task:7执行
task:10执行结束
task:11执行结束
task:12执行结束
task:14执行结束
task:5执行结束
task:6执行结束
task:7执行结束
task:9执行结束
task:8执行结束
线程池中的线程数:5 队列中等待的线程数:0 已执行完的线程数:15

 

转载于:https://www.cnblogs.com/justenjoy/p/7045206.html

你可能感兴趣的文章
拓扑排序基础题——排序
查看>>
转:iphone 申请证书
查看>>
Python就业方向
查看>>
一步步学习SPD2010--第二章节--处理SP网站(3)--创建网站层次架构
查看>>
TCP
查看>>
Excel常用函数大全
查看>>
团队-团队编程项目中国象棋-模块测试过程
查看>>
10个经典的C语言面试基础算法及代码
查看>>
普通的java Ftp客户端的文件上传
查看>>
视图系统
查看>>
Palindromes _easy version
查看>>
vue 小记
查看>>
CURRICULUM VITAE
查看>>
菱形缓冲器电路
查看>>
Groovy 程序结构
查看>>
使用 WordPress 的导航菜单
查看>>
input只能输入数字和小数点,并且只能保留小数点后两位 - CSDN博客
查看>>
js 不固定传参
查看>>
远程调试UWP遇到新错误Could not generate the root folder for app package ......
查看>>
[倍增][最短路-Floyd][dp]
查看>>