Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从ExecutorService中删除线程完成后的临时文件_Java_Multithreading - Fatal编程技术网

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

Java 从ExecutorService中删除线程完成后的临时文件,java,multithreading,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) /

我有一个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);
    });
}
publicstaticvoidmain(字符串[]args){
列表顺序=Lists.newArrayList();
//…填充订单
ExecutorService ExecutorService=Executors.newFixedThreadPool(3);
订单。forEach(o->{
//orderID将用于PDF文件名
PDFTask task=newpdftask(o.getOrderID());
执行器服务。提交(任务);
});
}
发送电子邮件后如何删除临时文件

我必须等到所有的PDFOrder处理完毕,而不是所有的临时文件都需要删除。我必须检查相应的PDFOrder是否标记为普通/重要。只有普通的PDFOrder将被删除,而重要的PDFOrder需要移动到其他目录中


谢谢

如果您将
PDFTask
转换为
可调用的
,并对其进行修改,使其返回
订单ID
(可能是一个
布尔值
或指示其通过或失败的内容),那么当您在执行器上调用
提交()
时,您就可以得到一个
Future
对象

如果您将所有的
期货
放入一个列表中,您可以通过调用
isDone()
来查询它们,查看它们是否完成。然后,您可以获得未来的结果,其中将包含您需要删除的
订单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 orders=new ArrayList();
// ... 填充订单
ExecutorService ExecutorService=Executors.newFixedThreadPool(3);
列表结果=新建ArrayList();
订单。forEach(o->{
//orderID将用于PDF文件名
PDFTask task=newpdftask(o.getOrderID());
结果.添加(executorService.submit(任务));
});

然后,您可以处理
期货的
列表
,不管您认为合适,反复循环,直到它们全部完成。

如果您将
PDFTask
转换为
可调用的
,并对其进行修改,使其返回
订单ID
(很可能是一个
布尔值
或指示它是否通过或失败的东西),然后在执行器上调用
submit()
时,可以获得一个
Future
对象

如果您将所有的
期货
放入一个列表,您可以通过调用
isDone()
来查询它们,查看它们是否完成。然后您可以得到未来的结果,其中将包含您需要删除的
订单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 orders=new ArrayList();
//…填充订单
ExecutorService ExecutorService=Executors.newFixedThreadPool(3);
列表结果=新建ArrayList();
订单。forEach(o->{
//orderID将用于PDF文件名
PDFTask task=newpdftask(o.getOrderID());
结果.添加(executorService.submit(任务));
});
然后,您可以处理
期货
列表
,无论您认为合适与否,反复循环,直到它们全部完成。

使用
ExecutorService的API来处理您的所有任务

invokeAll(Collection<? extends Callable<T>> tasks)
invokeAll(集合使用
ExecutorService
中的API来处理所有任务

invokeAll(Collection<? extends Callable<T>> tasks)

invokeAll(Collectioncheck mail send successfully
Files.delete(path);
那么,为什么不在PDFTask的run方法末尾添加这样的逻辑呢?我打赌你的PDFTask可以确定这是否是一个重要的订单。check mail send successfully
Files.delete(path)
那么,为什么不在PDFTask的run方法的末尾添加这样的逻辑呢?我敢打赌,PDFTask可以确定它是否是一个重要的订单。