如何使用Java Callable和Future设计AsyncTask?
我正在研究Android类的Java实现 我正在使用Java的未来类和可调用类。以下是我的异步任务:-如何使用Java Callable和Future设计AsyncTask?,java,android,android-asynctask,java.util.concurrent,callable,Java,Android,Android Asynctask,Java.util.concurrent,Callable,我正在研究Android类的Java实现 我正在使用Java的未来类和可调用类。以下是我的异步任务:- public abstract class AsyncTask<Params,Result>{ ExecutorService executor = Executors.newFixedThreadPool(10); protected abstract Result runInBackground(Params params); protected a
public abstract class AsyncTask<Params,Result>{
ExecutorService executor = Executors.newFixedThreadPool(10);
protected abstract Result runInBackground(Params params);
protected abstract void postExecute(Result result);
private Future<Result> future;
public void execute(Params params) {
future = executor.submit(new AsyncCallable<Params, Result>(params, this));
try {
postExecute(future.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
如果您看到,我的代码不是异步运行的,也就是说,我的两个异步任务都是在同一个线程上实现的。这就是为什么它要等待第一个任务完成,然后调用第二个异步任务。
你能帮我找出我未来代码中的问题吗?get()。详细说明Boris所说的:您的代码在后台线程中工作(输出中有pool-1-thread-1)。但是每次调用execute()都会调用future.get(),这是一个阻塞调用,等待任务完成。但是你能推荐其他方法吗?我可以通过它在任务完成时调用postExecute()方法。我不是在execute()方法中调用postExecute(future.get()),而是在call()方法中调用postExecute()。现在它正在异步工作。您还可以检查AsyncTask的源代码:
public class AsyncCallable<Params,Result> implements Callable<Result>{
private Params params;
private AsyncTask<Params, Result> asyncTask;
public AsyncCallable(Params params,AsyncTask<Params, Result> asyncTask) {
this.params = params;
this.asyncTask = asyncTask;
}
@Override
public Result call() throws Exception {
System.out.println(Thread.currentThread().getName()+" is executing");
return asyncTask.runInBackground(params);
}
}
public static void main(String args[]){
new AsyncTask<String, String>() {
@Override
protected String runInBackground(String params) {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "Hello "+params;
}
@Override
protected void postExecute(String result) {
System.out.println(result+" AFter 10 sec");
}
}.execute("World");
new AsyncTask<String, String>() {
@Override
protected String runInBackground(String params) {
try {
//Thread.sleep(2000);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "Hello "+params;
}
@Override
protected void postExecute(String result) {
System.out.println(result+" AFter 2 sec");
}
}.execute("World");
}
pool-1-thread-1 is executing
Hello World AFter 10 sec
pool-2-thread-1 is executing
Hello World AFter 2 sec