使用FutureTask同步获取结果,需要等待,callable 执行在executorHelper线程
一个ShareInfo类被多线程调用,那么 ShareInfo 类应该是线程安全的。
方式1:ShareInfo 的方法是同步的,使用 Synchronized, 或 ReentrainLock。
方式2:使用FutureTask,为ShareInfo类创建一个线程,把ShareInfo的各个方法封装成FutureTask,
放到ShareInfo的线程里单线程执行,然后调用 FutureTask.get()同步获取结果。
这样,也能达到线程安全的目的。
方式2的优点:如果有多个ShareInfo相似的类要相互调用,而且这些类都按照方式2的方法编写,应该不会出现死锁的情况。
循环调用的情况还是会死锁的,A->B->A
方式2的缺点是 多创建了一个线程。
public static <T> T syncCall(Callable<T> callable){
FutureTask<T> task = new FutureTask<T>(callable){
@Override
public boolean cancel(boolean mayInterruptIfRunning) {
// return super.cancel(mayInterruptIfRunning);
// 不能取消
return false;
}
};
executorHelper.runOnWorkThread(task);
T value = null;
while(true) {
try {
value = task.get();
}catch (CancellationException e){
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
continue;
}
break;
}
return value;
}