评论

收藏

[办公软件] 简单的包装一个线程池,存储所有任务的运行结果。,大牛手把手教你

电脑办公 电脑办公 发布于:2021-12-26 14:24 | 阅读数:205 | 评论:0

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<V> {
//持有外部类的弱引用
private WeakReference<MyCompleteExecutorService> 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<MyCompleteExecutorService> 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;
//记录任务的总数
private int taskNum;
public ArrayMap<K, V> getArrayMap() {
return mResultMap;
}
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
*/
public static abstract class MyCallable<K,V> implements Callable<V> {
//持有外部类的弱引用
private WeakReference<MyCompleteExecutorService> mWeakService;
//任务标识
private K key;
public K getKey() {
return key;
}
public void setKey(K key) {
this.key = key;
}
总结
Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!
上面分享的字节跳动公司2021年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
DSC0000.jpg
【Android学习PDF+学习视频+面试文档+知识点笔记】
【Android高级架构视频学习资源】
Android部分精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!


关注下面的标签,发现更多相似文章