初识Java线程池
来源:互联网 发布:网络文化节 编辑:程序博客网 时间:2024/05/17 09:21
先说一下线程池的好处,为什么要用线程池:
1.免去线程创建和销毁带来的性能开销,达到线程复用的效果。
2.能有效的控制线程池的最大并发数,避免大量的线程之间因互相抢占系统资源而导致的阻塞现象。
3.能够对线程进行简单的管理,并提供定时执行以及指定间隔循环执行等功能。
线程池的相关源码在 java.util.concurrent;下面
Android中的线程池都是通过配置 ThreadPoolExecutor来实现的,所以我们看一看这个类就行了,取自JDK 1.8
interface Executor
interface ExecutorService extends Executor
abstract classAbstractExecutorServiceimplementsExecutorService
classThreadPoolExecutorextendsAbstractExecutorService
先看看Executor
执行线程请求,可能新开线程,可能复用池内已有线程
void execute(Runnable command);
再看看ExecutorService
//在shutdown队列中进行该操作,不会等待该task执行完毕
void shutdown();
//关闭所有正在执行的task并返回列表
List<Runnable> shutdownNow();
//字面意思boolean isShutdown();
//判断shut down队列是否已经全部执行了boolean isTerminated();
//同shutdown()方法 但是会等待当前task执行完毕boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException;//立即执行该task<T> Future<T> submit(Callable<T> task);//添加到队列并返回结果<T> Future<T> submit(Runnable task, T result);//同上Future<?> submit(Runnable task);
//添加多个task,执行完毕后返回状态和结果<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException;//同上,加入了超时时间<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException;//加入多个task,返回执行成功的某个task的结果<T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException;//同上,加入了超时时间<T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;AbstractExecutorService是一个抽象类,实现了具体的方法,暂时不看。
最后看看和我们关系密切的ThreadPoolExecutor
看一下他的构造方法public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)一个个解释一下这几个形参的含义corePoolSize:线程池的核心线程数,一般情况下核心线程会在线程池中一直存活,当设置poolExecutor.allowCoreThreadTimeOut(),核心线程会根据keepAliveTime超时停止。maximumPoolSize:线程池的容量,当活动线程数达到这个数值后,后续的新任务将会被阻塞。keepAliveTime:非核心线程闲置时的超时时长,超时时,非核心线程会被回收。
unit:keepAliveTime的参数的时间单位,常用TimeUnit.SECONDS(秒),TimeUnit.MILLISECONDS(毫秒)。
workQueue:该线程池的任务队列,通过execute方法提交的Runnable对象会存储在这个队列中
threadFactory:线程工厂,为线程提供创建新线程的功能。
handler:不常用,用于线程池无法执行新任务时通过handler的rejectedExecution方法通知调用者。
下面以AsyncTask举例说明线程池的用法:
//获取Java虚拟机支持的并发数,一般是机器的核数private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();//设置线程池核心线程数private static final int CORE_POOL_SIZE = CPU_COUNT + 1;//设置线程池容量private static final int MAXIMUM_POOL_SIZE = CPU_COUNT*2 + 1;//设置线程超时时长1000msprivate static final int KEEP_ALIVE_TIME = 1000;//创建一个容量为128的任务队列private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingDeque<Runnable>(128);private static final ThreadFactory sThreadFactory = new ThreadFactory() { private final AtomicInteger mCount = new AtomicInteger(1); @Override public Thread newThread(@NonNull Runnable r) { return new Thread(r,"AsyncTask #" + mCount.getAndIncrement()); }};ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(CORE_POOL_SIZE ,MAXIMUM_POOL_SIZE ,KEEP_ALIVE_TIME , TimeUnit.MILLISECONDS ,sPoolWorkQueue ,sThreadFactory);poolExecutor.execute(new Runnable() { @Override public void run() { try { Thread.sleep(2000); final String name = Thread.currentThread().getName(); Log.i(TAG, "run: " + name); } catch (InterruptedException e) { e.printStackTrace(); } }});简单用法就写到这了,后面看看写一写更深入的用法吧。
阅读全文
0 0
- 初识 Java 线程池
- 初识 Java 线程池
- java线程池初识
- 初识java线程池
- 初识java线程池
- 初识Java线程池
- 初识java线程
- 初识java线程
- Java线程(初识)
- Java 线程的初识
- java线程浅析[初识线程]
- java线程池(1)初识线程池
- Java多线程编程--初识线程
- java--线程初识(1)
- ThreadPoolExcutor(线程池)初识
- ThreadPoolExcutor(线程池)初识
- Java多线程编程--(1)初识线程
- 初识Java--线程同步(2)
- bzoj 2282: [Sdoi2011]消防
- JEESZ分布式框架安装和使用
- Intent的Bundle传值
- ucos2裁剪
- 微信小程序页面传值详解
- 初识Java线程池
- 本网站response.sendRedirect跳转到别人网站的时候,会被本网站的Filter拦截
- html5标签
- SpringBoot 极简MyBatis分页插件
- Java Unsafe
- WPF学习记录-布局[摘抄自博客园(xiepeixing<WPF布局该如何选用panel>与(DotNet菜园<WPF入门教程系列七——布局之WrapPanel与StackPanel(二)>))]
- 如何从本地向阿里云或其他服务器传输文件?
- php设计模式-对象池模式(Object pool)
- 1060. 爱丁顿数(25)