简单的包装一个线程池,存储所有任务的运行结果。,Android阿里等大厂面试题汇总

文章描述了一个自定义的线程池管理类MyCompleteExecutorService,它使用ExecutorService,支持Callable和Runnable任务提交,通过弱引用跟踪任务执行状态,完成计数并提供回调接口。作者还分享了如何在Android开发中使用此类来提高任务处理效率。
摘要由CSDN通过智能技术生成

下面自己写一个类包装我们线程池,实现我们的需求。

下面动手实现以下我们的代码:

首先我们创建一个类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移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

如果你进阶的路上缺乏方向,可以点击我的【Github】加入我们的圈子和安卓开发者们一起学习交流!
以下全部内容都可以在GitHub中获取!

  • Android进阶学习全套手册

    img

  • Android对标阿里P7学习视频

    img

  • BATJ大厂Android高频面试题

    img

最后,借用我最喜欢的乔布斯语录,作为本文的结尾:

人这一辈子没法做太多的事情,所以每一件都要做得精彩绝伦。
你的时间有限,所以不要为别人而活。不要被教条所限,不要活在别人的观念里。不要让别人的意见左右自己内心的声音。
最重要的是,勇敢的去追随自己的心灵和直觉,只有自己的心灵和直觉才知道你自己的真实想法,其他一切都是次要。

获取!

  • Android进阶学习全套手册

    [外链图片转存中…(img-VpI77tmH-1711099883251)]

  • Android对标阿里P7学习视频

    [外链图片转存中…(img-M8ii2oZM-1711099883252)]

  • BATJ大厂Android高频面试题

    [外链图片转存中…(img-3SyD6lpl-1711099883252)]

最后,借用我最喜欢的乔布斯语录,作为本文的结尾:

人这一辈子没法做太多的事情,所以每一件都要做得精彩绝伦。
你的时间有限,所以不要为别人而活。不要被教条所限,不要活在别人的观念里。不要让别人的意见左右自己内心的声音。
最重要的是,勇敢的去追随自己的心灵和直觉,只有自己的心灵和直觉才知道你自己的真实想法,其他一切都是次要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值