我正在使用ExecutorService运行一些可调用线程。线程在提交到ExecutorService之前用数据初始化。
在处理Future.get()引发的异常时,我希望使用原始数据记录一条消息。是否可以从未来对象返回到创建它的原始线程?
伪代码:
void run(List<Data> dataList) {
List<Future<Foo>> results = new ArrayList<Future<Foo>>();
for (Data data : dataList) {
Callable<Foo> thread = new FooCallable(data);
Future<Foo> result = this.executorService.submit(thread);
results.add(result);
}
...
for (Future<Foo> result : results) {
Foo foo;
try {
foo = result.get();
} catch (InterruptedException e) {
//
// I would like access to the original Data object here
//
} catch (ExecutionException e) {
//
// and here
//
}
}
}
是否有可能从Future对象返回到创建它的原始线程?
我想你的意思是想访问导致异常的Data
字段。您可以通过创建一个小容器类来实现这一点:
private static class FutureData {
final Data data;
final Future<Foo> future;
public FutureData(Data data, Future<Foo> future) {
this.data = data;
this.future = future;
}
}
然后,当您创建未来时,您将添加一个FutureData
到results
列表中。
List<FutureData> results = new ArrayList<FutureData>();
for (Data data : dataList) {
Callable<Foo> callable = new FooCallable(data);
Future<Foo> future = this.executorService.submit(callable);
results.add(new FutureData(data, future));
}
然后你可以做:
for (FutureData futureData : results) {
Foo foo;
try {
foo = futureData.future.get();
} catch (Exception e) {
// use futureData.data here
...
使用地图而不是列表来存储未来及其相应的数据,并将未来用作该地图的键:
Map<Future<Foo>,Data> results = new HashMap<Future<Foo>,Data>();
for (Data data : dataList) {
Callable<Foo> thread = new FooCallable(data);
Future<Foo> result = this.executorService.submit(thread);
results.put(result,data);
}
Iterator<Map.Entry<Future<Foo>,Data>> resultsIterator = results.entrySet().iterator();
while(resultsIterator.hasNext()) {
Map.Entry<Future<Foo>,Data> entry = resultsIterator.next();
Future<Foo> future = entry.getKey();
Data data = entry.getValue();
Foo foo;
try {
foo = future.get();
} catch (InterruptedException e) {
//data accessible here
} catch (ExecutionException e) {
//data accessible here too
}
}
我在我的应用程序中使用CloudKit作为远程保存数据的一种方式。我的一个记录具有保存图像的CKAsset属性。当我获取记录时,我意识到完成查询要花很多时间。经过多次测试,我得出结论,当您查询记录时,CloutKit会用record对象下载整个资产文件。因此,当您从record对象获取资产并请求它的fileURL时,它会给您一个本地文件路径URL,而不是HTTP类型的URL。这对我来说是一个问题,
问题内容: 我需要一种从try / catch块的中间中断而又不会引发异常的方法。类似于中断并继续for循环的操作。这可能吗? 我对于抛出一个自定义异常(将其命名为“ BreakContinueException”)变得很奇怪,该异常在其catch处理程序中什么都不做。我敢肯定这很扭曲。 因此,我不知道任何直接的解决方案吗? 问题答案: 正确的方法可能是通过将try-catch块放在单独的方法中来
我试图用java解码JWT负载,但是这个负载被压缩/压缩了 JAVAutil。拉链DataFormatException:标头检查不正确 其他一些使用其他编程语言的人能够用这个解决这个问题,他们想知道我将如何用java实现这一点?
我一直在试图确定如何检测点异常给定窗口异常。 更详细地说,我知道每个30天窗口是否包含异常。例如,窗口1从2009年1月1日开始,窗口2从2009年1月2日开始,依此类推。 现在我正试图利用这些知识来确定这些异常发生的日期。如果我在2009年5月1日至2009年8月1日期间出现异常,我的窗口将从2009年1月8日最后一天的窗口发出窗口信号,从2009年5日开始。 我只是不明白如何使用窗口找到出现异
问题内容: 我想做一个常见问题面板,当用户问它在部门顶部显示的任何问题而无需重新加载页面时,我想我必须每隔几秒钟就与数据库建立连接。现在的问题是,如何在不重新加载页面的情况下建立连接,以及如何显示新问题? 问题答案: 您有两种选择: Ajax,它允许您使用JavaScript从服务器检索数据,然后可以使用它来操作DOM。Ajax的基础是对象,它使您可以在JavaScript中完全检索后台数据。请注
我有一个实现以下接口的基类,上面声明的方法抛出基本异常类型。 有许多具体的类扩展了基类,我不想在所有这些类中添加块。有没有一种方法可以处理而不添加? 接口 基层 混凝土类示例(共30个)