我有一个fixedThreadPool,我用它来运行一堆工作线程来实现具有许多组件的任务的并行执行.
当所有线程都完成后,我使用方法(getResult)检索它们的结果(它们非常大)并将它们写入文件.
最终,为了节省内存并能够看到中间结果,我希望每个线程在完成执行后立即将其结果写入文件,然后释放其内存.
通常,我会在run()方法的末尾添加代码.但是,此类中的某些其他对象也会调用这些线程,但不要让它们将结果写入文件 – 而是使用其结果执行其他计算,最终将这些计算写入文件.
所以,我想知道是否可以使用ExecutorService将回调函数附加到线程完成事件.这样,我可以立即检索其结果并释放该场景中的内存,但在其他场景中使用这些线程时不会破坏代码.
这样的事情可能吗?
解决方法:
如果使用Google Guava是一个选项,您可以通过以下方式使用ListenableFuture界面:
>通过MoreExecutors.listeningDecorator(existingExecutorService)将ExecutorService转换为ListeningExecutorService
> ListeningExecutorService的submit(Callable< V>)方法已缩小以返回ListenableFuture,它是Future的子接口.
> ListenableFuture有一个addListener()方法,因此您可以注册在未来完成时运行的回调.