ListenableFuture: 可以监听的Future,继承了Future。
-
Callable接口,与Runnable接口作用类似,但是可以设置返回值。
// 实现Callable接口
class Task implements Callable<String> {
private String ticket;
public Task(String ticket) {
this.ticket = ticket;
}
//重写Call()方法
@Override
public String call() throws Exception {
System.out.println("已卖" + ticket);
return ticket;
}
}
- FutureCallback接口,获取异步计算的结果,使用onSuccess()和onFailure()进行回调
//实现FutureCallback接口
class MyFutureCallback implements FutureCallback<String> {
@Override
public void onSuccess(String str) {
System.out.println(str + "成功了");
}
@Override
public void onFailure(Throwable throwable) {
}
}
- 全部代码
public class ConcurrentDemo {
public List<String> createTickets() {
ArrayList<String> strings = new ArrayList<String>();
for (int i = 0; i < 100; i++) {
strings.add("ticket" + i);
}
return strings;
}
// 实现Callable接口
class Task implements Callable<String> {
private String ticket;
public Task(String ticket) {
this.ticket = ticket;
}
//重写Call()方法
@Override
public String call() throws Exception {
System.out.println("已卖" + ticket);
return ticket;
}
}
/**
* 实现FutureCallback接口,获取异步计算的结果,使用onSuccess()
* 和onFailure()回调
*/
class MyFutureCallback implements FutureCallback<String> {
@Override
public void onSuccess(String str) {
System.out.println(str + "成功了");
}
@Override
public void onFailure(Throwable throwable) {
}
}
@Test
public void sellTickets() {
//产生车票
List<String> tickets = createTickets();
/* //创建线程池
ExecutorService pool = new ThreadPoolExecutor(5, 10, 0L,TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());*/
//线程池
ExecutorService pool = Executors.newFixedThreadPool(10);
ListeningExecutorService service = MoreExecutors.listeningDecorator(pool);
//初始化一个ListenableFuture的list
ArrayList<ListenableFuture<String>> futures = Lists.newArrayList();
for (int i = 0; i < tickets.size(); i++) {
ListenableFuture<String> submit = service.submit(new Task(tickets.get(i)));
//添加回调函数
Futures.addCallback(submit, new MyFutureCallback());
futures.add(submit);
}
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
System.out.println(e);
} finally {
pool.shutdown();
System.out.println("操作完毕");
}
}
}