android-线程池-最顺手的写法

引子

关于线程池,在这里写出几种最顺手的写法,至于原理以及各种细节。放后面再填;

经过查证,凡是 以前new Thread()的地方,貌似都可以用线程池来执行,优化内存消耗。

 

代码

系统提供的4种预设线程池类:

 1      Runnable runnable = new Runnable() {
 2             @Override
 3             public void run() {
 4                 Log.d("atm", "假装有执行过程·");
 5             }
 6         };
 7 
 8         //第一类
 9         // 全部由核心线程去实现,并不会被回收,没有超时限制和任务队列的限制,会创建一个定长线程池,
10         // 可控制线程最大并发数,超出的线程会在队列中等待
11         ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);
12         fixedThreadPool.execute(runnable);
13 
14         //第二类
15         //该模式下线程数量不定的线程池,只有非核心线程,最大值为Integer.MAX_VALUE,会创建一个可缓存线程池,
16         // 如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程
17         ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
18         cachedThreadPool.execute(runnable);
19 
20         //第三类
21         //该模式下核心线程是固定的,非核心线程没有限制,非核心线程闲置时会被回收。
22         // 会创建一个定长线程池,执行定时任务和固定周期的任务
23         ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(4);
24         scheduledThreadPool.schedule(runnable, 2000, TimeUnit.SECONDS);//2000ms后执行。
25         scheduledThreadPool.scheduleAtFixedRate(runnable, 10, 1000, TimeUnit.MILLISECONDS);//延迟10ms后,每隔1000ms执行一次
26 
27         //第四类,
28         //该模式下线程池内部只有一个线程,所有的任务都在一个线程中执行,会创建一个单线程化的线程池,
29         // 它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
30         ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
31         singleThreadExecutor.execute(runnable);

 

不用系统的,而是自己定义各种参数:

 1 import android.support.annotation.NonNull;
 2 
 3 import java.util.concurrent.Callable;
 4 import java.util.concurrent.Future;
 5 import java.util.concurrent.LinkedBlockingDeque;
 6 import java.util.concurrent.ThreadFactory;
 7 import java.util.concurrent.ThreadPoolExecutor;
 8 import java.util.concurrent.TimeUnit;
 9 import java.util.concurrent.atomic.AtomicInteger;
10 
11 /**
12  */
13 public class CustomThreadPool {
14 
15     private static final int CORE_POOL_SIZE = 3;//核心线程数目
16     private static final int MAX_POOL_SIZE = 20;//最大线程数,除了核心线程就是非核心线程
17     private static final int ALIVE_TIME = 5;//非核心线程允许闲置的最大时长
18 
19     private static final CustomThreadPool instance;
20 
21     private final ThreadPoolExecutor pool;
22 
23     static {
24         instance = new CustomThreadPool();
25     }
26 
27     private CustomThreadPool() {
28         //参数逐个解析
29         /**
30          * @param 核心线程的数目,即使他们是闲置状态,也不会被回收,除非你设置 allowCoreThreadTimeOut,让核心线程也有超时时间(不过一般不这么做)
31          * @param 线程池的最大容量,可以容纳核心线程和非核心线程
32          * @param 当线程数目大于核心线程数,这个值是被回收的最大闲置时间,超出则会被回收
33          * @param 超时时间的单位(一般用秒,或者毫秒)
34          * @param 等待队列,当核心线程都在工作,而又有新的任务需要执行,这些任务则会先进入等待队列(但是如果进不去,或者队列满了,就会尝试用非核心线程)
35          * @param 生成线程的工厂(一般都会自己new 一个类继承ThreadFactory)
36          * @throws IllegalArgumentException 参数异常
37          *         可能抛出的异常,
38          *         比如,你把核心线程数设置为负数;
39          *         或者超时时间设置为负数
40          *         或者最大线程数是非正数;
41          *         或者最大线程数小于 核心线程数
42          * @throws NullPointerException
43          *         当 工作队列是空,或者 线程工厂,对象是空,就会报空指针
44          */
45         pool = new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, ALIVE_TIME, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(), new MyThreadFactory());
46     }
47 
48     public static CustomThreadPool getInstance() {
49         return instance;
50     }
51 
52     /**
53      * 执行,无返回值
54      *
55      * @param r
56      */
57     public void execute(Runnable r) {
58         pool.execute(r);
59     }
60 
61     /**
62      * 提交,有返回值
63      *
64      * @param r
65      * @return
66      */
67     public Future<String> submit(Runnable r, String s) {
68         return pool.submit(r, s);
69     }
70 
71     public Future<String> submit(Callable<String> callable) {
72         return pool.submit(callable);
73     }
74 
75     private class MyThreadFactory implements ThreadFactory {
76 
77         private final AtomicInteger mCount = new AtomicInteger(1);
78 
79         @Override
80         public Thread newThread(@NonNull Runnable r) {
81             Thread thread = new Thread(r, "GWThreadPool-" + mCount.getAndIncrement());
82             thread.setPriority(Thread.NORM_PRIORITY - 1);
83             thread.setDaemon(false);
84             return thread;
85         }
86     }
87 
88 }

 

带返回值的执行,以及不带返回值的执行;

 1  private void test2() {
 2         //如果你想执行一个带返回值的任务,任务执行完成之后,返回结果,用下面的代码
 3         try {
 4             Callable<String> callable = new Callable<String>() {// 注意这里不是Runnable,而是Callable,
 5                 @Override
 6                 public String call() {
 7                     return "哈哈哈";
 8                 }
 9             };
10 
11             //````如果你想执行任务,并且要取执行完成之后的返回值,用submit吧
12             Future<String> s = CustomThreadPool.getInstance().submit(callable);//执行,submit 有返回值
13             //下面有5个API可供调用
14             /**
15              *  尝试取消任务的执行。这种尝试将会失败,当任务已经完成,已经被取消,或者因为某种原因不能被取消。
16              *  如果成功取消,这个任务还没开始的话,那这个任务将永远不会执行,
17              *  如果任务已经开始,那就要 mayInterruptIfRunning 参数值将会决定是否要尝试去终止任务;(true,尝试终止,false,不去尝试;至于为什么这里是尝试,而不是一定终止,参照本段开头;)
18              *  当这个方法返回,后来的调用isDone将会永远返回true,也就是说,取消也算做是完成?
19              *  后来的调用isCanceled   将会永远返回true,如果这个方法返回true的话。
20              * @param mayInterruptIfRunning  是否执行这个任务线程的线程能够被中断;true能够中断,false,将会继续执行直到完成;
21              * @return 返回值,false,如果这个任务不能被取消,典型的就是这个任务已经完成了·· 其他情况,返回true;
22              */
23             s.cancel(true);// 取消任务,参数的意思是:是否允许在执行过程中中断; 如果true,不管是不是已经开始任务,都让他终止;false,如果已经开始了,就不终止了;
24             s.isDone();//是否已完成
25             s.isCancelled();// 是否已经被取消
26 
27             String result = s.get();// 获取执行的结果,如果任务尚未执行完成,有可能会阻塞一段时间
28             String result2 = s.get(3, TimeUnit.SECONDS);//最多等待3秒,get的重载方法,因为有可能会阻塞,阻塞的时长不定,所以提供一个重载方法,指定阻塞的最大时间;
29 
30             //````如果你只是想执行任务,不想要返回值,那么,用execute
31             Runnable runnable = new Runnable() {
32                 @Override
33                 public void run() {
34                     Log.d("hahaha", "假装这里有代码");
35                 }
36             };
37             CustomThreadPool.getInstance().execute(runnable);
38 
39         } catch (InterruptedException e) {
40             e.printStackTrace();
41         } catch (ExecutionException e) {
42             e.printStackTrace();
43         } catch (TimeoutException e) {
44             e.printStackTrace();
45         }
46     }

 

转载于:https://www.cnblogs.com/hankzhouAndroid/p/9505423.html

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

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

相关文章

使用Java和Google GSON解析ESPN API

在我的第一篇文章中&#xff0c;我将解释如何解析ESPN API。 可以在http://developer.espn.com/docs上找到API文档。 首先&#xff0c;您需要请求一个API密钥&#xff0c;然后可以开始查询REST API以检索JSON响应。 在下面的示例中&#xff0c;我将简单地查询在英格兰英超联赛…

java string对象创建对象_Java String 创建了几个对象

我们首先来看一段代码&#xff1a;Java代码String strnew String("abc");紧接着这段代码之后的往往是这个问题&#xff0c;那就是这行代码究竟创建了几个String对象呢&#xff1f;相信大家对这道题并不陌生&#xff0c;答案也是众所周知的&#xff0c;2个。接下来我们…

js 图片不保存的回显功能/图片尺寸验证/图片大小验证 /图片类型验证

大部分转自&#xff1a;http://blog.csdn.net/qq_39200924/article/details/79198766 在项目中经常用到input标签来上传文件&#xff0c;而这些文件通常是图片文件。图片有很多格式我们只需要其中的几种&#xff0c;就需要对用户上传的文件进行验证&#xff0c;在HTML5中有一个…

sqlx使用说明

sqlx使用指南 参考链接: http://jmoiron.github.io/sqlx/ sqlx是一个go语言包&#xff0c;在内置database/sql包之上增加了很多扩展&#xff0c;简化数据库操作代码的书写 资源 如果对go语言的sql用法不熟悉&#xff0c;可以到下面网站学习:http://go-database-sql.org/ 如果对…

填充一个池需要多少个线程?

近几个月来&#xff0c;我们一直看到一小部分但持续的操作失败&#xff0c;并带有一个奇怪的异常– org.springframework.jdbc.CannotGetJdbcConnectionException –“无法获得JDBC连接&#xff1b; 嵌套异常是java.sql.SQLException&#xff1a;客户端尝试检出Connection的尝试…

@font-face 用字体画图标

HTML 1 <body>2 <!-- ul.layout>li*5>a[href#]>i.icon -->3 <!-- Sublime Text 快捷拼写 -->4 <ul class"layout">5 <li><a href"#"><i class"icon">&#xe601;</…

java mapfile_基于文件的数据结构:关于MapFile

MapFile是已经排过序的SequenceFile&#xff0c;它有索引&#xff0c;所以可以按键查找1.MapFile的写操作MapFile的写操作类似于SequenceFile的写操作。新建一个MapFile.Writer实例&#xff0c;然后调用append()方法顺序写入文件内容。如果不按顺序写入&#xff0c;就抛出一个I…

linux scp 命令

scp 命令 scp 命令 意思是 secure copy 即安全拷贝&#xff0c;可以把它看做是 cp 命令的高级版&#xff0c;可以跨主机拷贝。 经常用来在局域网内不同主机之间分享文件&#xff0c;或者在本机与远程主机中分享文件。 在使用的时候就像使用cp 命令一样&#xff0c;第一个参数是…

工厂设计模式–一种有效的方法

如您所知&#xff0c;工厂方法模式或俗称工厂设计模式是“创意设计模式”类别下的一种设计模式。 模式背后的基本原理是&#xff0c;在运行时&#xff0c;我们根据传递的参数获得类似类型的对象。 关于这种模式有很多文章&#xff0c;开发人员可以通过各种方式来实现它。 在本文…

java 循环依赖_解决Java循环依赖的问题

最近看到一个问题&#xff1a;如果有两个类A和B&#xff0c;A类中有一个B的对象b&#xff0c;B类中有一个A的对象a&#xff0c;那么如何解决这两个类的相互依赖关系呢&#xff0c;几天就给大家说一下Java的循环依赖&#xff0c;raksmart服务器。举个栗子1&#xff1a;可以看到A…

CSS块元素水平垂直居中的实现技巧

针对之前遇到过的一些特殊样式的实现&#xff0c;我今天做个总结&#xff0c;目的有二&#xff1a;一是将这些方法记录下来&#xff0c;以便将来需要用到时查找使用。二为将这些大神们智慧的结晶发扬光大&#xff0c;让广大前端程序猿们能够少走弯路。此贴为更新帖&#xff0c;…

Intellij IDEA 将工程转换成maven工程 详解

1> 右键工程&#xff0c;点击 Add Framework Support2> 选中 Maven&#xff0c;再点击 OK3> 工程根目录自动生成 pom.xml 文件&#xff0c;这样 工程就支持 Maven版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 http://blog.csdn.net/che…

设置Apache Hadoop多节点集群

我们正在分享有关在基于Linux的机器&#xff08;多节点&#xff09;上安装Apache Hadoop的经验。 在这里&#xff0c;我们还将分享我们在各种故障排除方面的经验&#xff0c;并在将来进行更新。 用户创建和其他配置步骤– 我们首先在每个集群中添加一个专用的Hadoop系统用户。…

数据结构(七)排序---直接插入排序(稳定)

经典排序算法----直接插入排序算法及其改进&#xff08;稳定&#xff09; 定义&#xff1a; 直接插入排序的基本操作是将一个记录插入到已经排好序的有序表中&#xff0c;从而得到一个新的&#xff0c;记录数加一的有序表。 实现思想 我们预留了一个哨兵&#xff0c;这里我们将…

CSS3中的透明属性opacity的用法实例

实例设置 div 元素的不透明级别&#xff1a;div{opacity:0.5;}完整例子&#xff1a;<!DOCTYPE html><html><head><style> div{background-color:red;opacity:0.5;filter:Alpha(opacity50); /* IE8 以及更早的浏览器 */}</style></head><…

java嵌套类型 无法隐藏外层类型_java内部类深入详解 内部类的分类 特点 定义方式 使用...

java内部类 内部类的分类 特点 定义方式 使用 外部类调用内部类 多层嵌套内部类 内部类访问外部类属性 接口中的内部类 内部类的继承 内部类的覆盖 局部内部类 成员内部类 静态内部类 匿名内部类内部类定义将一个类定义放到另一个类的内部,这就是内部类内部类与组合是完…

java.io.FileNotFoundException: generatorConfig.xml (系统找不到指定的文件。)

在使用MyBatis的逆向工程生成代码时&#xff0c;一直报错java.io.FileNotFoundException: generatorConfig.xml (系统找不到指定的文件。)&#xff0c;如图 文件结构如下&#xff1a; 代码如下&#xff1a; import java.io.File; import java.util.ArrayList; import java.util…

单例设计模式–鸟瞰

几天前&#xff0c;当我回到家乡时&#xff0c;我的一位来自同事的大三学生参加了一家跨国公司的采访&#xff0c;在采访过程中受了重伤。 我的意思是&#xff0c;由于面试小组提出的难题&#xff0c;他无法使面试合格。 当我回到班加罗尔时&#xff0c;他分享了他在技术面试中…

软件实践第一步——自我介绍

031602631&#xff1b;我是超爱美食的苏韫月&#xff1b;我的爱好是品尝所能接触到的所有甜点&#xff08;迟早&#xff01;&#xff09;&#xff1b;我最近新宠&#xff1a;拌面加扁肉&#xff08;京园淳百味&#xff09;&#xff1b;时隔一年我又回归心惊胆颤写博客文的日子。…

CSS3中使用translate() 方法实现元素位置的移动

translate() 方法通过 translate() 方法&#xff0c;元素从其当前位置移动&#xff0c;根据给定的 left&#xff08;x 坐标&#xff09; 和 top&#xff08;y 坐标&#xff09; 位置参数&#xff1a;实例div{transform: translate(50px,100px);-ms-transform: translate(50px,1…