java线程池之小结
来源:互联网 发布:行者骑行软件 编辑:程序博客网 时间:2024/06/07 03:53
先看两个概念:
线程:进程中负责程序执行的执行单元。一个进程中至少有一个线程。
多线程:解决多任务同时执行的需求,合理使用CPU资源。多线程的运行是根据CPU切换完成,如何切换由CPU决定,因此多线程运行具有不确定性。
线程池定义
线程池基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。
Java里面线程池的顶级接口是 Executor,不过真正的线程池接口是 ExecutorService, ExecutorService 的默认实现是 ThreadPoolExecutor;普通类 Executors 里面调用的就是 ThreadPoolExecutor。
线程池源码
public interface Executor { void execute(Runnable command);}public interface ExecutorService extends Executor { void shutdown(); List<Runnable> shutdownNow(); boolean isShutdown(); boolean isTerminated(); <T> Future<T> submit(Callable<T> task); <T> Future<T> submit(Runnable task, T result); Future<?> submit(Runnable task); ...}public class Executors { public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } ...}
线程池的优点
- 避免线程的创建和销毁带来的性能开销。
- 避免大量的线程间因互相抢占系统资源导致的阻塞现象。
- 能够对线程进行简单的管理并提供定时执行、间隔执行等功能。
线程池的使用
在Java中Executors是一个关于线程池的父亲接口该类中具有多个构造方法,用来完成不同类型的线程池的创建
1、固定大小的线程池
Executors threadPool= (Executors) Executors.newFixedThreadPool(3);
固定大小的线程池当多个任务同时提交时,始终在线程池中具有一开始设置的线程数目,多余该数目的其他任务暂时阻塞在队列中等待线程池的操作。
2、具有缓冲的线程池(可变大小的线程池)
Executors threadPool= (Executors) Executors.newCachedThreadPool();
此类型线程池大小随着任务数量的多少,进行浮动的线程数创建,线程池中的线程数是浮动的。
3、单个线程的线程池
Executors threadPool=Executors.newSingleThreadExecutor();
此类线程池中的线程数始终只有一个,并且不会增多或者减少。
比较 单个线程的线程池和单独一个线程:
- 单个线程的线程池,当该线程被关闭之后,线程池自动会生成一个新的线程来维持线程池中始终有一个线程;
- 在运行的职责,类似线程被重新启动了,但是线程不再是之前的那个线程,因为线程号已经变化;
- 单独一个线程,当该线程被关闭之后就关闭了,没有重新启动。
Android中的线程池
在Android中使用的线程池是ThreadPoolExecutor
ThreadPoolExecutor threadPoolExecutor= new ThreadPoolExecutor(int corePoolSize, int maxinumPoolSize, long keepAliveTime, TimeUnit unit, BlockingDeque<Runnable> workQueue, ThreadFactory threadFactory);
各参数含义:
- int corePoolSize : 线程池中的核心线程数
- int maxinumPoolSize :线程池中允许的最大线程数目
- long keepAliveTime :非核心线程的超时时间,超出这个时间非核心线程会被回收
- TimeUnit unit :非核心线程的超时时间的时间单位
- BlockingDeque workQueue : 保存需要线程池执行的任务的列表
- ThreadFactory threadFactory : 线程工厂,只是一个接口,只有一个方法Thread newThread(Runnable r)
使用示例:
public class MyThreadFactory { //Android的线程池类 private static ThreadPoolExecutor threadPoolExecutor=null; //获取当前用户的手机的CPU的核心数 private static int num=Runtime.getRuntime().availableProcessors(); //用于存储提交任务的任务队列 private static BlockingDeque<Runnable> workQueue=new LinkedBlockingDeque<>(num*50); private MyThreadFactory(){ } public static ThreadPoolExecutor getThreadPoolExecutor(){ if(null==threadPoolExecutor){ threadPoolExecutor=new ThreadPoolExecutor(num*2, num*4, 8, TimeUnit.SECONDS, workQueue, new ThreadPoolExecutor.CallerRunsPolicy());// threadPoolExecutor=new ThreadPoolExecutor(1, 1, 8, TimeUnit.SECONDS, workQueue, new ThreadPoolExecutor.CallerRunsPolicy()); } return threadPoolExecutor; }}
阅读全文
0 0
- java线程池之小结
- java 线程池小结
- java小结_022_线程池
- Java线程池ThreadPoolExecutor小结
- java + 线程系列之一些定义(小结)
- java 线程 小结
- java 线程小结
- java 线程小结
- java 线程小结
- Java 小结-线程
- java线程小结
- java 线程关闭小结
- java 线程关闭小结
- java的线程小结
- java 线程小结
- Java中线程小结
- java 线程关闭小结
- Java线程学习小结
- [Python]
- Android人脸识别Demo竖屏YUV方向调整和图片保存
- SDUT 2711 4-2 电子时钟中的运算符重载
- Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quickstart:RELEASE
- jdk8 类和接口的多继承详解
- java线程池之小结
- 百度编辑器idea中 jsp运用
- monkeyrunnerdevice api
- Linux终极shell-Z Shell--用强大的zsh & oh-my-zsh把Bash换掉
- git mac自动补全
- Java实现SparkSQL查询Hive表数据
- Django框架学习笔记(12.基本知识小总结)
- python中的sys.argv[]什么意思呢。
- 阿里云CDN接入操作