从ExecutorService完成线程后删除临时文件

时间:2016-05-11 04:36:27

标签: java multithreading

我有一个基本上可以执行此操作的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需要移动到其他目录中。

由于

2 个答案:

答案 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列表。

完成所有任务后,您可以继续删除临时文件。