我有一个基本上可以执行此操作的runnable:创建一个pdf文件,然后发送附带pdf文件的电子邮件
public class PDFTask implements Runnable {
// .... constructor & other codes
public void run() {
// ... create PDF, save it to temporary dir with unique name (xxx.pdf)
// ... attach and send email
}
}
每个任务最多可能需要30秒才能完成,因此我使用ExecutorService执行并行任务
public static void main(String[] args) {
List<PDFOrder> orders = Lists.newArrayList();
// ... populate orders
ExecutorService executorService = Executors.newFixedThreadPool(3);
orders.forEach(o -> {
// orderID will be used for PDF filename
PDFTask task = new PDFTask(o.getOrderID());
executorService.submit(task);
});
}
如何在发送电子邮件后删除临时文件?
我必须等到所有PDFOrder都处理完毕,并不是所有的临时文件都需要删除。我必须检查相应的PDFOrder是否标记为公共/重要。只删除常用的PDFOrder,而重要的PDFOrder需要移动到其他目录中。
由于
答案 0 :(得分:0)
如果您将public-beta
转换为PDFTask
并对其进行修改,则会返回Callable
(可能还有order ID
或其他内容,表明它是通过还是失败),当您在遗嘱执行人身上致电boolean
时,您可以获得Future<>
个对象。
如果您将所有submit()
放入列表中,则可以通过调用Future<>s
来查询它们,看看它们是否已完成。然后你可以得到未来的结果,其中包含你需要删除的isDone()
(或者可能没有,取决于它是&#34;普通&#34;或&#34;重要的&#34; ,你如何确定你的问题不清楚)
编辑:这是一个快速而又肮脏的例子:
order ID
然后,您可以处理 List<PDFOrder> orders = new ArrayList<>();
// ... populate orders
ExecutorService executorService = Executors.newFixedThreadPool(3);
List<Future<String>> results = new ArrayList<>();
orders.forEach(o -> {
// orderID will be used for PDF filename
PDFTask task = new PDFTask(o.getOrderID());
results.add(executorService.submit(task));
});
List
但是您认为合适,一遍又一遍地遍历它,直到它们全部完成。
答案 1 :(得分:0)
使用ExecutorService
中的invokeAll API来处理您的所有任务。
invokeAll(Collection<? extends Callable<T>> tasks)
执行给定的任务,在完成所有任务后返回持有其状态和结果的Futures列表。
完成所有任务后,您可以继续删除临时文件。