Java 从ExecutorService中删除线程完成后的临时文件
我有一个runnable,基本上就是这样做的:创建一个pdf文件,然后发送带有附加pdf文件的电子邮件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) /
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 successfullyFiles.delete(path);
那么,为什么不在PDFTask的run方法末尾添加这样的逻辑呢?我打赌你的PDFTask可以确定这是否是一个重要的订单。check mail send successfullyFiles.delete(path)
那么,为什么不在PDFTask的run方法的末尾添加这样的逻辑呢?我敢打赌,PDFTask可以确定它是否是一个重要的订单。