网上看到,说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研究深刻的同学,帮忙解答一下吧