我有一个fixedThreadPool,我正在使用它运行一组工作线程,以实现具有许多组件的任务的并行执行。
当所有线程完成后,我使用方法(getResult)检索它们的结果(相当大),并将其写入文件。
最后,为了节省内存并能够看到中间结果,我希望每个线程在完成执行后将其结果写入文件,然后释放内存。
通常,我会在run()方法的末尾添加这样的代码。但是,此类中的某些其他对象也调用这些线程,但不希望它们将结果写入文件-相反,它们使用它们的结果来执行其他计算,这些计算最终被写入文件。
所以,我想知道是否可以将回调函数附加到使用ExecutorService完成线程的事件中。这样,我可以立即检索其结果并在该场景中释放内存,但在其他场景中使用这些线程时不会破坏代码。
这样的事情可能吗?
ExecutorService#提交
返回未来任务
ExecutorService executor = Executors.newFixedThreadPool(10);
Future<Long> future = executor.submit(new Callable<Long>(){
@Override
public Long call() throws Exception {
long sum = 0;
for (long i = 0; i <= 10000000l; i++) {
sum += i;
}
return sum;
}
});
Long result = future.get();
System.out.println(result);
您可以在Java 8中使用CompletableFuture添加线程返回的回调,如下所示,其中t是长期运行计算的结果,
CompletableFuture.supplyAsync(() -> {
T t = new T();
// do something
return t;
}).thenApply(t -> {
// process t
});
如果您只想在Java 7中使用回调,可以执行以下操作:,
int x = 10;
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(x);
Future<T> result = fixedThreadPool.submit(() -> {
// do calculation
return T;
});
fixedThreadPool.submit(() -> {
long minutesToWait = 5;
T t = null;
try {
t = result.get(minutesToWait, TimeUnit.MINUTES);
} catch (InterruptedException | ExecutionException | TimeoutException e) {
LOGGER.error(e);
}
if (t != null) {
// process t
}
});
如果可以选择使用Google Guava,则可以以下列方式使用ListenableFuture界面:
我应该创建一个从迭代器中提取下一个任务的任务吗?或者有什么更好的方法来实现这一点?
在直播管理页面点击 “回调设置” ,可以 开启回调通知 并 设置回调地址 ,用于直播开始、直播结束、直播录制、离线回放、回放重置后的通知反馈。 关于直播回调的具体功能及使用方法,请参考:回调接口开发指南 。
问题内容: 我正在研究用于并行计算JavaSeis.org的软件开发框架。我需要一个强大的机制来报告线程异常。在开发过程中,了解异常来自何处具有很高的价值,因此我想在过度报告方面犯错。我还希望能够在线程中处理Junit4测试。下面的方法是合理的还是有更好的方法? 问题答案: 我不相信在使用时有标准的“钩子”来获取这些异常。但是,如果您需要支持(听起来很合理,假设您使用),则始终可以包装Callab
问题内容: 我有使用计划任务的代码。我环顾四周,发现可以做到这一点。因此,这里有一个问题,你是否使用过并安排了任务,一次使用比另一次使用有什么好处? 还想检查是否有人使用过该课程并遇到任何为他们解决的问题。 问题答案: 根据实践中的Java并发性: 对系统时钟的变化很敏感,不是。 只有一个执行线程,因此长时间运行的任务可能会延迟其他任务。可以配置任意数量的线程。此外,你可以根据需要完全控制创建的线
java.util.concurrent.ExecutorService接口是Executor接口的子接口,并添加了管理生命周期的功能,包括单个任务和执行程序本身。 ExecutorService方法 Sr.No. 方法和描述 1 boolean awaitTermination(long timeout, TimeUnit unit) 阻止所有任务在关闭请求之后完成执行,或发生超时,或者当前线程
我正在尝试并行运行15个服务,每个服务将向不同的客户发送邮件。提取标准因服务而异 服务1、服务2、服务3。。。。服务15。每个类都扩展了NotificationService类。 NotificationService类具有方法extractRecipients()、sendMail()、sendSMS()、logNotification()。 所有的Service类[1到15]都有进程()方法,