好的,所以你有一个类以阻塞的方式从网页获取一些数据,并采用一些参数:
public class DataFetcher { public Data fetchData(int param1, int param2) { // ... } }
现在你想要两次同时执行这个方法,然后回到期货。所以你只需要创建一个Callable:
final DataFetcher fetcher = new DataFetcher(); Callable<Data> task1 = new Callable<>() { @Override public Data call() { return fetcher.fetchData(1, 2); } }; Callable<Data> task2 = new Callable<>() { @Override public Data call() { return fetcher.fetchData(3, 4); } }; Future<Data> result1 = executorService.submit(task1); Future<Data> result2 = executorService.submit(task2);
我在这里看不到任何可变状态。
为避免重复代码和使用匿名类,您可以定义顶级类:
public DataFetcherTask implements Callable<Data> { private final DataFetcher fetcher; private final int param1; private final int param2; public DataFetcherTask(DataFetcher fetcher, int p1, int p1) { this.fetcher = fetcher; this.param1 = p1; this.param2 = p2; } @Override public Data call() { return fetcher.fetchData(param1, param2); } };
然后像这样使用它:
Future<Data> result1 = executorService.submit(new DataFetcherTask(fetcher, 1, 2)); Future<Data> result2 = executorService.submit(new DataFetcherTask(fetcher, 3, 4));
这里仍然没有可变状态的痕迹。