下面自己写一个类包装我们线程池,实现我们的需求。
下面动手实现以下我们的代码:
首先我们创建一个类MyCompleteExecutorService,在它内部我们定义几个成员变量:
//持有的线程池实例
private ExecutorService executorService;
//用来记录任务执行完成的数量
private AtomicInteger alreadyFinishNum;
//存储我们的任务结果
private ArrayMap<K, V> arrayMap;
//记录任务的总数
private int taskNum;
定义我们的构造方法:
public MyCompleteExecutorService(ExecutorService executorService) {
this.mExecutorService = executorService;
//初始化计数器
this.mAlreadyFinishNum = new AtomicInteger(0);
}
接下来我们在内部定义两个提交任务的方法,方法内部我们调用线程池提交任务的方法:
/**
-
提交Callable任务
-
@param tag
-
@param task
*/
public void submitTask(K tag ,MyCallable<K,V> task) {
task.setKey(tag);
taskNum++;
mExecutorService.submit(task);
}
/**
-
提交Runnable任务
-
@param runnable
*/
public void submitTask(MyRunnable runnable) {
taskNum++;
mExecutorService.submit(runnable);
}
定义我们自己的任务类分别继承自Callable和Runnable,
在两个类中,分别持有外部类的弱引用。当任务执行完成我们把已完成的任务计数器+1,如果有返回结果,我们就把返回结果放入我们的mResultMap中。
/**
- 继承Callable
*/
public static abstract class MyCallable<K,V> implements Callable {
//持有外部类的弱引用
private WeakReference mWeakService;
//任务标识
private K key;
public K getKey() {
return key;
}
public void setKey(K key) {
this.key = key;
}
public MyCallable(MyCompleteExecutorService myCompleteExecutor) {
mWeakService = new WeakReference<>(myCompleteExecutor);
}
@Override
public V call() throws Exception {
if(mWeakService.get().mResultMap==null){
mWeakService.get().mResultMap = new ArrayMap();
}
//获取我们的返回结果
V result = doMyCall();
//任务执行结果放入Map中存储起来
mWeakService.get().mResultMap.put(key,result);
//计数器+1
mWeakService.get().addFinishNum();
return result;
}
/**
-
子类必须实现这个方法
-
@return
*/
protected abstract V doMyCall();
}
/**
- 继承Runnable
*/
public static abstract class MyRunnable implements Runnable {
private WeakReference mWeakService;
public MyRunnable(MyCompleteExecutorService myCompleteExecutor) {
mWeakService = new WeakReference<>(myCompleteExecutor);
}
@Override
public void run() {
doMyRunnable();
if (mWeakService.get() != null) {
//计数器+1
mWeakService.get().addFinishNum();
}
}
/**
- 子类必须实现的方法
*/
protected abstract void doMyRunnable();
}
我们的计数器+1的方法:
private void addFinishNum() {
mAlreadyFinishNum.incrementAndGet();
if (mAlreadyFinishNum.get() == taskNum) {
//全部完成
if (taskCallback != null) {
//执行接口方法
taskCallback.alreadyFinishAllTask(taskNum);
}
}
}
定义我们的回调接口:
public interface FinishTaskCallback {
void alreadyFinishAllTask(int finishNum);
}
private FinishTaskCallback taskCallback;
public FinishTaskCallback getTaskCallback() {
return taskCallback;
}
public void setTaskCallback(FinishTaskCallback taskCallback) {
this.taskCallback = taskCallback;
}
完整代码实现如下:
public class MyCompleteExecutorService<K, V> {
//持有的线程池实例
private ExecutorService mExecutorService;
//用来记录任务执行完成的数量
private AtomicInteger mAlreadyFinishNum;
//存储我们的任务结果
private ArrayMap<K, V> mResultMap;
//记录任务的总数
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
如果你进阶的路上缺乏方向,可以点击我的【Github】加入我们的圈子和安卓开发者们一起学习交流!
以下全部内容都可以在GitHub中获取!
-
Android进阶学习全套手册
-
Android对标阿里P7学习视频
-
BATJ大厂Android高频面试题
最后,借用我最喜欢的乔布斯语录,作为本文的结尾:
人这一辈子没法做太多的事情,所以每一件都要做得精彩绝伦。
你的时间有限,所以不要为别人而活。不要被教条所限,不要活在别人的观念里。不要让别人的意见左右自己内心的声音。
最重要的是,勇敢的去追随自己的心灵和直觉,只有自己的心灵和直觉才知道你自己的真实想法,其他一切都是次要。
获取!
-
Android进阶学习全套手册
[外链图片转存中…(img-VpI77tmH-1711099883251)]
-
Android对标阿里P7学习视频
[外链图片转存中…(img-M8ii2oZM-1711099883252)]
-
BATJ大厂Android高频面试题
[外链图片转存中…(img-3SyD6lpl-1711099883252)]
最后,借用我最喜欢的乔布斯语录,作为本文的结尾:
人这一辈子没法做太多的事情,所以每一件都要做得精彩绝伦。
你的时间有限,所以不要为别人而活。不要被教条所限,不要活在别人的观念里。不要让别人的意见左右自己内心的声音。
最重要的是,勇敢的去追随自己的心灵和直觉,只有自己的心灵和直觉才知道你自己的真实想法,其他一切都是次要。