Java(Android)线程池

 
1、new Thread的弊端
执行一个异步任务你还只是如下new Thread吗?
[java] view plaincopy
  1. new Thread(new Runnable() {  
  2.   
  3.     @Override  
  4.     public void run() {  
  5.         // TODO Auto-generated method stub  
  6.     }  
  7. }).start();  

那你就out太多了,new Thread的弊端如下:

a. 每次new Thread新建对象性能差。
b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。
c. 缺乏更多功能,如定时执行、定期执行、线程中断。
相比new Thread,Java提供的四种线程池的好处在于:
a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。
b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
c. 提供定时执行、定期执行、单线程、并发数控制等功能。

 

2、Java 线程池
Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

(1). newCachedThreadPool
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。示例代码如下:

[java] view plaincopy
  1. ExecutorService cachedThreadPool = Executors.newCachedThreadPool();  
  2. for (int i = 0; i < 10; i++) {  
  3.     final int index = i;  
  4.     try {  
  5.         Thread.sleep(index * 1000);  
  6.     } catch (InterruptedException e) {  
  7.         e.printStackTrace();  
  8.     }  
  9.   
  10.     cachedThreadPool.execute(new Runnable() {  
  11.   
  12.         @Override  
  13.         public void run() {  
  14.             System.out.println(index);  
  15.         }  
  16.     });  
  17. }  

线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。

(2). newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。示例代码如下:

[java] view plaincopy
  1. ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);  
  2. for (int i = 0; i < 10; i++) {  
  3.     final int index = i;  
  4.     fixedThreadPool.execute(new Runnable() {  
  5.   
  6.         @Override  
  7.         public void run() {  
  8.             try {  
  9.                 System.out.println(index);  
  10.                 Thread.sleep(2000);  
  11.             } catch (InterruptedException e) {  
  12.                 // TODO Auto-generated catch block  
  13.                 e.printStackTrace();  
  14.             }  
  15.         }  
  16.     });  
  17. }  

因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。

定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()。可参考PreloadDataCache。

(3) newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下:

[java] view plaincopy
  1. ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);  
  2. scheduledThreadPool.schedule(new Runnable() {  
  3.   
  4.     @Override  
  5.     public void run() {  
  6.         System.out.println("delay 3 seconds");  
  7.     }  
  8. }, 3, TimeUnit.SECONDS);  

表示延迟3秒执行。

定期执行代码如下:

[java] view plaincopy
  1. scheduledThreadPool.scheduleAtFixedRate(new Runnable() {  
  2.   
  3.     @Override  
  4.     public void run() {  
  5.         System.out.println("delay 1 seconds, and excute every 3 seconds");  
  6.     }  
  7. }, 1, 3, TimeUnit.SECONDS);  

表示延迟1秒后每3秒执行一次。

ScheduledExecutorService比Timer更安全,功能更强大,后面会有一篇单独进行对比。

(4)、newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下:

[java] view plaincopy
  1. ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();  
  2. for (int i = 0; i < 10; i++) {  
  3.     final int index = i;  
  4.     singleThreadExecutor.execute(new Runnable() {  
  5.   
  6.         @Override  
  7.         public void run() {  
  8.             try {  
  9.                 System.out.println(index);  
  10.                 Thread.sleep(2000);  
  11.             } catch (InterruptedException e) {  
  12.                 // TODO Auto-generated catch block  
  13.                 e.printStackTrace();  
  14.             }  
  15.         }  
  16.     });  
  17. }  

结果依次输出,相当于顺序执行各个任务。

单线程在某些情况下非常有用,现行大多数GUI程序都是单线程的。后面会介绍在Android中单线程在性能优化方面的用处。

转载于:https://www.cnblogs.com/hudabing/p/4150265.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259636.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JQuery链式操作简单的菜单列表

看到这个简单的菜单demo&#xff0c;也是为了再看看JQuery对DOM的操作&#xff0c;一直都记不牢&#xff0c;特别是siblings&#xff08;&#xff09;这个总是想不起来。 这次再过一遍JQuery&#xff0c;不管简单的还是复杂的demo 还是坚持练习一遍吧&#xff01;只为记录&…

java 网络编程实验_Java网络编程入门实验一涉及点

1.http://www.cr173.com/html/20128_all.html 【wireshark怎么抓包、wireshark抓包详细图文教程】2.http://blog.csdn.net/huangjin0507/article/details/51678858 【HTTP协议1&#xff1a;工作原理】3.https://www.cnblogs.com/1666818961-lxj/p/7210021.html 【网络常用端口号…

node.js async流程控制器--queue(队列)

queue流程控制器是一个并行的流程控制器,但是它与parallel的区别在于queue可以控制一次执行几个函数,而parallel只是让所有函数并行执行. 例子如下: var q async.queue(function (obj,cb) {setTimeout(function () {console.log(obj);cb(); },obj.time) },1)for (var i 0; i&…

利用JS实现点击上一周或下一周却换

1.页面加载显示当前年份的第几周 效果如图&#xff1a; html代码&#xff1a; <font size"2" color"black"> <input id"btnweek5" type"button" class"btn" value"上周" οnclick"EduCommissio…

centos7网卡编辑_CentOS7修改网卡为eth0

1.编辑网卡信息[rootlinux-node2~]#cd /etc/sysconfig/network-scripts/ #进入网卡目录[rootlinux-node2network-scripts]# mv ifcfg-eno16777728 ifcfg-eth0 #重命名网卡名称[rootlinux-node2 network-scripts]#cat ifcfg-eth0 #编辑网卡信息TYPEEthernetBOOTPROTOstaticDEFR…

C# 微支付退款申请接口 V3.3.6

/// <summary>/// 微支付退款申请/// </summary>/// <param name"context"></param>/// <param name"returnMsg"></param>/// <returns></returns>public bool Refund(HttpContext context, ref string r…

[转] 英语、计算机、互联网与全球化

http://davidzhao.blog.51cto.com/4548102/1225732 转载于:https://www.cnblogs.com/wowk/p/3169638.html

APNIC IP 库

http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest转载于:https://www.cnblogs.com/dlwj/p/6388162.html

java reference 传引用_Java的引用(reference)---Roni

摘自《Java面向对象编程》一书,作者:孙卫琴 来源:www.javathinker.org在JDK1.2以前的版本中&#xff0c;当一个对象不被任何变量引用&#xff0c;那么程序就无法再使用这个对象。也就是说&#xff0c;只有对象处于可触及状态&#xff0c;程序才能使用它。这就像在日常生活中&am…

C# 以管理员身份运行程序

刚看了一篇博友写的“以管理员身份运行程序”, 所以我也来写一个简单易懂的&#xff0c;简单两步搞定&#xff0c;不用写任何代码&#xff1a; 第一步&#xff1a; 右键选择项目 > 添加 > 新建项 &#xff1b; 找到 应用程序清单文件&#xff0c;后缀名为manifest&#x…

会计转行从事IT,如何在一年时间内全职学习?

2019独角兽企业重金招聘Python工程师标准>>> https://www.zhihu.com/question/21427478/answer/18227060 转载于:https://my.oschina.net/soho00147/blog/836138

VS2010中使用CL快速 生成DLL的方法

方案一&#xff1a; 1、命令行中输入cl example.cpp&#xff0c;生成example.obj和example.lib文件。有可能还会提示“没有入口点”的错误。这是因为我们的CPP中是要生成dll文件的&#xff0c;并没有main()这样的主函数作为入口点。如果是C文件&#xff0c;则输入cl /c exampl…

java field 获得值_反射通用获取字段值

像之前回答的那样&#xff0c;您应该使用&#xff1a;Object value field.get(objectInstance);有时更喜欢的另一种方法是动态调用getter。示例代码&#xff1a;public static Object runGetter(Field field, BaseValidationObject o){// MZ: Find the correct methodfor (Met…

android 中如何模拟back键

主要是在使用Fragment时能够返回前一级&#xff0c;所以才找到了这些资料。 有两种方式可以实现&#xff0c;直接上代码 方法1&#xff1a; public void onBack(){new Thread(){public void run() {try{Instrumentation inst new Instrumentation();inst.sendKeyDownUpSync(Ke…

如何生成后缀表达式

如果计算一个表达式&#xff0c;比如 456*2&#xff0c;随着计算器的不同&#xff0c;简单的四功能计算器是30&#xff0c;许多科学计算器知道乘法的优先级高于加法&#xff0c;所以科学答案是21。典型计算顺序可以是计算45&#xff0c;存为临时变量a&#xff0c;再计算6*2&…

【原生JS插件】LoadingBar页面顶部加载进度条

先展示一下已经实现的效果&#xff1a; 预览地址&#xff1a;http://dtdxrk.github.io/js-plug/LoadingBar/index.html 看到手机上的浏览器内置了页面的加载进度条&#xff0c;想用在pc上。 网上搜了一下&#xff0c;看到几种页面loading的方法&#xff1a; 1.在body头部加入lo…

qtp启动java程序_转: QTP六脉神剑之调用Java程序

查看( 1147 ) /评论( 21 )六脉神剑之调用程序0Xp1zLN_0版权声明&#xff1a;原创作品&#xff0c;转载请以链接方式注明出自http://www.51testing.com/?35&#xff0c;否则将追究法律责任。51Testing软件测试网y|X,taS51Testing软件测试网b;|w6I"g6oK本文出自songfun的51…

Linq 数据库操作(增删改查)

Linq数据库增删改查 Linq是一种查询语言&#xff0c;集成包含在formwork中&#xff0c;包含在C#语言中&#xff0c;它的作用是降低查询的门槛&#xff0c;提高开发效率&#xff0c;是我们必须掌握的技术之一&#xff0c;下面是我自己对linq数据库操作的方法&#xff0c;与大家…

第八章 Python 对象和类

一、什么是对象 在 Pyth 中&#xff0c;对象就是经过实例化的&#xff0c;具体可以操作的一组代码的组合&#xff1b; 对象一般包含数据&#xff08;变量&#xff0c;更习惯称之为属性 attribute&#xff09;&#xff0c;也包含代码&#xff08;函数&#xff0c;也称之为方法&a…

JS同名方法,

JS同名方法只会调用最后一个方法。 JS中同时绑定多个事件&#xff0c;先绑定的先调用。后绑定的后调用。转载于:https://www.cnblogs.com/daishuguang/p/4169718.html