Java在JDK1.6提供了Future,FutureTask,ExecutorService等用于支持异步编程,但是Future,FutureTask没有提供Callback机制,只能主动轮询,通过get去获取结果。Spring的ListenableFutureTask对此做了扩展,支持callback机制。使得编程变得更加的简单。
测试代码
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import org.junit.Test;
import org.springframework.util.concurrent.ListenableFutureCallback;
import org.springframework.util.concurrent.ListenableFutureTask;
public class ListenableFutureTaskTest {
@Test
public void test01() throws InterruptedException, ExecutionException {
//
ListenableFutureTask<String> task = new ListenableFutureTask<String>(new Callable<String>() {
@Override
public String call() throws Exception {
Thread.sleep(5000); // 模拟耗时操作
return "success";
}
});
// 注册回调事件
task.addCallback(new ListenableFutureCallback<String>() {
@Override
public void onSuccess(String result) {
try {
TimeUnit.SECONDS.sleep(5);
System.out.println("调用成功,返回结果是:" + result);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Throwable ex) {
ex.printStackTrace();
System.out.println("调用失败了...");
}
});
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(task);
// 节则向下执行
System.out.println("Main ...");
Thread.sleep(100000);
}
}