Android中的线程机制是非常重要的,在很多情况下为了使APP不卡顿,我们需要将很多事情放到子线程中执行,使主线程尽量没有耗时操作,否则会导致ANR.Android中的线程几乎完全采用了Java中的线程机制,那么创建、销毁、调度线程对线程的了解就很重要了.
Runnable/Callable
如何创建一个线程我相信只要做过Java的都会创建.这里就简单介绍一下.
new Thread(){
@Override
public void run() {
super.run();
}
};
new Thread(new Runnable() {
@Override
public void run() {
}
});
需要注意的是
Runnable 和 Callable,它们两个都是线程中执行的任务,主要区别是Callable可以在任务完成时能够返回一个值,Callable 可以返回装载有计算结果的 Future 对象.它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过 Future 对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果;Runnable是执行工作的独立任务,它不返回任何值.
Thread类只支持Runnable接口,只有线程池支持Callable
下面我们通过一个例子,看一下Callable
private static void callable() {
ExecutorService executorService = Executors.newCachedThreadPool();
List<Future<String>> futureList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
//submit 会产生Future对象 它用Callable返回的结果的特定类型进行了参数化
//可以用future.isDone来查询future是否已经完成 直接调用future.get可能会阻塞 知道结果准备就绪
futureList.add(executorService.submit(new TaskWithResult(i)));
}
for (Future<String> future : futureList) {
try {
if (future.isDone()) {
System.out.println(future.get());
}
} catch (InterruptedException | ExecutionException e) {
System.out.println(e);
} finally {
executorService.shutdown();
}
}
}
public class TaskWithResult implements Callable<String> {
private int id;
public TaskWithResult(int id) {
this.id = id;
}
@Override
public String call() throws Exception {
return "TaskWithResult is id:" + id;
}
}
Thread 也可以实现这种方式,FutureTask.
为了更好的阅读体验,阅读全文:https://www.jakeprim.cn/2019/02/17/asyncTask/#more