关于AsyncTask 在3.0之后串行的问题,为什么实际测试不是串行?

lxn97 2016-11-18 04:29:50
网上看到,说3.0版本之后,AsyncTask不再是并行,是串行的,要执行完一个再执行下一个,更准确的说是使用execute不再是并行,是串行,如果需要并行,就需要调用executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);

但是又有看到一个说法,4.4版本一下默认线程池有5个线程,4.4版本以上是cpu数+1个,而这个说法,跟我实际测试的结果相同,可是这还是并行啊,不是说3.0之后是串行么?

我写了一个AsyncTask进行测试:

private class TestTask extends AsyncTask<String, Long, Boolean>{
String name;
TestTask(String name){
this.name = name;
}

@Override
protected Boolean doInBackground(String... params) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}

@Override
protected void onPostExecute(Boolean result) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
AppLog.e("debug", "---- " + name + " ------ " + df.format(new Date()));
}
}

调用:
new TestTask("task1").execute();
new TestTask("task2").execute();
new TestTask("task3").execute();
new TestTask("task4").execute();
new TestTask("task5").execute();
new TestTask("task6").execute();
new TestTask("task7").execute();
new TestTask("task8").execute();
new TestTask("task9").execute();
new TestTask("task10").execute();
new TestTask("task11").execute();

我用了一个5.0系统,8核cpu的手机测试,测试结果如下:


可以看出,总共11个AsyncTask,有9个在同时执行,剩下的2个明显是3秒后才执行的,也就是说前边的9个是并行的,并没有串行,why?

然后我又用了一个4.2的系统测试,同一时间执行的有5个线程,3秒后,再有5个执行,再过3秒,剩下的1个执行。

以上两个测试结果,也符合了前边提到的一个说法,4.4以上线程池有cpu数+1个线程,4.4一下默认有5个;
可是这和3.0以后使用execute为串行不符合啊;

于是我将源码中的AsyncTask拷贝了一份到项目中,然后将自己写的那个测试TestTask继承自己项目中这个AsyncTask然后神奇的事情发生了。。。

这回变成执行一个,3秒后执行下一个,到真的串行了。。。然后将继承的AsyncTask改回源码中的,又变成之前的样子了,并行并行。。。
对于AsyncTask的源码也研究了下,但是怎么看走的流程确实应该是走串行的方式。。。

难道说是我不理解什么叫并行,什么叫串行么?

于是乎,最终,我成功的晕了。。。有对AsyncTask研究深刻的同学,帮忙解答一下吧
...全文
94 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧