四种线程池的使用
2016-07-18 22:05
302 查看
线程池是一种对象池,目的是减小对象的创建和注销的开支,减轻JVM的压力 为什么使用线程池 newThread 有很多弊端 1 新建对象性能差 2 线程之间缺乏统一管理,可能无限的创建线程,相互之间的竞争会带来过多系统的损耗,导致死机或者oom; 3 缺乏更多的功能,例如 定时执行 定期执行 线程中断 可以基本理解为线程池扩展了很多新功能。 Java通过Executors提供四种线程池,分别为: 1:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。(用多少拿多少) 2:newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 3:newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, 优先级)执行。 4:newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。 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; 1: //给线程池添加任务 CachedPool.execute(new Runnable() { @Override public void run() { //try { Thread.sleep(index *1000); } catch (InterruptedException e) { e.printStackTrace(); } Log.i("打印编号",""+index); } }); } 2: // newFixedThreadPool //创建一个定长的线程池,可控制线程的最大并发数,超出的线程会在排列等待 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(1000); 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.i("打印数据",""+ index); } }); } 3: //单线程线程池 //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.i("数据打印",""+ index); } catch (InterruptedException e) { e.printStackTrace(); } } }); } 4: //scheduledThreadPool //创建一个定长的线程池,支持定期和定时的任务执行 ... 参数是最大线程数 ScheduledExecutorService schemePool = Executors.newScheduledThreadPool(5); //延时操作 //参数1 :操作的任务 参数2 :要延迟的时间 参数3:延迟的时间的单位 schemePool.schedule(new Runnable() { @Override public void run() { Log.i("打印","任务执行完毕"); } },3, TimeUnit.SECONDS); //定时周期性的任务 //参数1:要执行的任务 参数2:延迟多长时间 参数3:周期时间(每隔多长时间触发一次) 参数4:时间的单位 schemePool.scheduleAtFixedRate(new Runnable() { @Override public void run() { Log.i("打印","我在执行"); } },1,5,TimeUnit.SECONDS);
相关文章推荐
- 7月第三周——任务
- km算法学习小记
- Apache:使用mod_wsgi时自动reload代码
- JavaWeb---制作验证码
- oracle_sql的用法?
- Android 4.4 Kitkat 使能有线网络 Ethernet
- HTML代码教程
- 回文树——BZOJ 2160: 拉拉队排练
- STM32F401 SDIO HAL driver初始化SD卡
- PAT-B 1018.锤子剪刀布
- Spark tungsten shuffle
- HTML代码教程
- 死锁产生的必要条件,如何有效地避免死锁
- 为什么无穷大总是0x3f3f3f3f?
- TOJ 1455.Ultra-QuickSort(分治经典题目)
- POJ 2828 Buy Tickets
- 快速修复网页在IE8 下的显示兼容问题
- POJ3267 -- The Cow Lexicon( 字符匹配dp动态规划 )
- u-boot编译
- css 新颖的表单边框