线程池使用对象的概念,目的是减小对象的创建和注销的开支,减轻JVM(就是JAVA虚拟机)的压力。
newTread的弊端:
1.新建对象性能差;
2.线程之间缺乏统一管理,可能无限创建线程,相互之间竞争会带来过多的系统损耗,
到最后死机或者oom;
3.缺乏更多的功能,例如定时执行,定期执行,线程中断,可以基本理解为线程池扩展许多新功能;
所以说,如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间
Java可以通过Executors创建四中线程池,分别为:
1.newCachedThreadPool
创建一个可以缓存的线程池,可灵活回收空闲线程,若无可回收线程再穿件新线程
就是用多少拿多少;
2.newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
3. newScheduledThreadPool
创建一个定长的线程池,支持定时即周期性任务执行
第一个参数是要操作的任务,第二个参数是要延迟的时间,第三个参数是延迟的时间的单位
4.newSingleThreadPool
创建一个单线程化的线程池,它只会用唯一 的工作线程来执行任务,保证所有 任务按照指定顺序执行
Executor是一个顶层接口,在它里面只声明了一个方法execute(Runnable),返回值为void,参数为Runnable类型,从字面意思可以理解,就是用来执行传进去的任务的;然后ExecutorService接口继承了Executor接口,并声明了一些方法:submit、invokeAll、invokeAny以及shutDown等;抽象类AbstractExecutorService实现了ExecutorService接口,基本实现了ExecutorService中声明的所有方法;然后ThreadPoolExecutor继承了类AbstractExecutorService。
所以execute()方法实际上是Executor中声明的方法,在ThreadPoolExecutor进行了具体的实现,这个方法是ThreadPoolExecutor的核心方法,通过这个方法可以向线程池提交一个任务,交由线程池去执行。
代码示例
public class MainActivity extends AppCompatActivity {
/**
* 线程池是一种对象池的概念,目的是减少对象的创建和注销的开支,减轻JVM(JAVA虚拟机)的压力
*
* 为什么使用线程池
* newThread有很多弊端,
* 1.新建对象性能差
* 2.线程之间缺乏统一管理,可能无限创建线程,相互之间竞争会带来很多的系统损耗
* 导致死机或者oom
* 3.缺乏更多的功能,例如定时执行,定期执行,线程中断,可以基本理解为线程池扩展了很多功能
*
* JAVA可以通过Executors创建四种线程池
* 1.newCachedThreadPool,创建一个可以缓存的线程池,可灵活回收空闲线程,若无可回收线程再穿件新线程
* 就是用多少拿多少
* @param savedInstanceState
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 创建一个可缓存的线程池
// ExecutorService Cachedpool = Executors.newCachedThreadPool();
// for (int i = 0;i < 1000; i++){
// final int index = i;
// try {
// Thread.sleep(1*1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// 给线程池添加任务
// Cachedpool.execute(new Runnable() {
// @Override
// public void run() {
// Log.e("打印编号",""+index);
// }
// });
// }
// newFixedThreadPool
// 创建一个定长的线程,可控制线程的最大并发数,超出的线程会在队列等待
// ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
// for (int i = 0;i < 1000;i++){
// final int index = i;
//
// fixedThreadPool.execute(new Runnable() {
// @Override
// public void run() {
// try {
// Thread.sleep(index*1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// Log.e("打印数据",""+index);
// }
// });
// }
// 单线程线程池
// newSingleThreadPool
// ExecutorService singlepool = Executors.newSingleThreadExecutor();
// for (int i = 0;i<10 ;i++){
// final int index = i;
// singlepool.execute(new Runnable() {
// @Override
// public void run() {
// try {
// Thread.sleep(2000);
// Log.e("数据打印",""+index);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// }
// });
// }
// scheduledThreadPool
// 创建一个定长的线程池,支持定期和定时的任务执行,参数是最大线程数
ScheduledExecutorService scheduledpool = Executors.newScheduledThreadPool(5);
// 延时操作 第一个参数是要操作的任务,第二个参数是要延迟的时间,第三个参数是延迟的时间的单位
// scheduledpool.schedule(new Runnable() {
// @Override
// public void run() {
// Log.e("打印","任务执行完毕");
// }
// },3, TimeUnit.SECONDS);
// 定时周期性任务
// 第一个参数是要执行的任务;第二个参数是延时时间;第三个参数是周期时间(每隔多长时间触发一次);第四个参数是时间的单位
scheduledpool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
Log.e("打印","我在执行");
}
},1,5,TimeUnit.SECONDS);
}
}