在java中,如何运行某些东西,等待任何子后台任务完成后才能继续前进?

时间:2015-05-19 02:59:37

标签: java multithreading

我认为在一个单独的方法中创建子进程并从main运行该方法将阻止它移动直到返回该方法,但我遇到的是在方法中,我正在尝试创建一个文件和然后以只读方式打开文件(只是从缓冲区打开文件或作为副本),当返回时,它会删除文件(因为技术上没有使用文件),但我收到的错误是我尝试打开它时找不到该文件。如果我注释掉删除代码,它打开正常,但我有一堆文件堆积。我不完全理解Thread类。

            Integer intRndm = (int)(Math.round(Math.random()*999999999+1));
            String strFile = "C:\\Temp\\IPAddresses" + intRndm + ".xls";
            fileCreate(strFile);
            File DelFile = new File(strFile);
            Process Wait = Runtime.getRuntime().exec("Ping -n 4 localhost");
            Wait.waitFor();
            DelFile.delete();

    private void fileCreate(String strFile){
    try{
        InputStream ExIPs = new FileInputStream("\\\\path\\IPAddresses.xls");
        Workbook wb = WorkbookFactory.create(ExIPs);
        Sheet sheet = wb.getSheetAt(0);
        Row row1 = sheet.getRow(1);
        Cell cell1 = row1.getCell(2);
        cell1.setCellValue(intStr); 
        Row row2 = sheet.getRow(2);
        Cell cell2 = row2.getCell(2);
        cell2.setCellValue(strOct);
        FileOutputStream fileOut = new FileOutputStream(strFile);
        wb.write(fileOut);
        ExIPs.close();
        fileOut.close();
        Runtime.getRuntime().exec("\"C:\\Program Files (x86)\\Microsoft Office\\OFFICE11\\EXCEL.EXE\" /r " + strFile);
        return;
    }
    catch(Exception e){
        return;
    }
}

我最初在上面方法的部分中的fileCreate方法中拥有了所有内容。有人告诉我,把它放在自己的方法中应该可行,但事实并非如此。我知道一个选项是使用waitFor()和excel的执行,但这意味着应用程序用户将无法使用该应用程序,直到他们使用excel完成,我不想发生。创建的电子表格有时会与应用程序一起使用。此外,随机数的原因只是在文件没有被删除的情况下,不存在冲突。

我现在使用线程执行以下操作:

    private void butIPsActionPerformed(java.awt.event.ActionEvent evt) {                                       
    try{
            Integer intRndm = (int)(Math.round(Math.random()*999999999+1));
            String strFile = "C:\\Temp\\IPAddresses" + intRndm + ".xls";
            CountDownLatch waitForFiles = new CountDownLatch(1);
            FileCreate Pass1 = new FileCreate(waitForFiles, strFile);
            new Thread(Pass1).start();
            waitForFiles.await();
            File DelFile = new File(strFile);
            DelFile.delete();
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}                                      

public class FileCreate extends Thread{
    CountDownLatch latch = null;
    String strFile = null;
    public FileCreate(CountDownLatch latch,String strFile){
        this.latch = latch;
        this.strFile = strFile;
    }
    public void run(){
        try{
            InputStream ExIPs = new FileInputStream("\\\\path\\IPAddresses.xls");
            Workbook wb = WorkbookFactory.create(ExIPs);
            Sheet sheet = wb.getSheetAt(0);
            Row row1 = sheet.getRow(1);
            Cell cell1 = row1.getCell(2);
            cell1.setCellValue(intStr); 
            Row row2 = sheet.getRow(2);
            Cell cell2 = row2.getCell(2);
            cell2.setCellValue(strOct);
            FileOutputStream fileOut = new FileOutputStream(this.strFile);
            wb.write(fileOut);
            ExIPs.close();
            fileOut.close();
            Runtime.getRuntime().exec("\"C:\\Program Files (x86)\\Microsoft Office\\OFFICE11\\EXCEL.EXE\" /r " + this.strFile);
            this.latch.countDown();
        }
        catch(Exception e){
            return;
        }
    }
}

为了确保变量正常传递,我在其await()之前和之后为其添加了一些system.out,并为strFile的run()添加了另一个system.out,以确保传递到右边。在等待它是1之前,等待它是0,但完全相同的事情发生了。

这里的答案之一说,等到另一个应用程序完成打开很难,或者我认为不可能,这是有道理的,exec只是打开excel,而且它做得很好然后继续线程。我只需要向进程添加waitFor([3or4],TimeUnit.Seconds)。

2 个答案:

答案 0 :(得分:0)

问题是DelFile.delete()将在Runtime.getRuntime()之前执行.exec(“\”C:\ Program Files(x86)\ Microsoft Office \ OFFICE11 \ EXCEL.EXE \“/ r”+ strFile)完成。所以你应该等待excel进程完成并去删除文件 但是当excel文件打开时你仍然想要使用app,所以你可以在新线程中启动进程excel并在excel进程中添加waitfor

new Thread(new Runnable(){

            @Override
            public void run() {
             fileCreate(strFile);
             File DelFile = new File(strFile);
             DelFile.delete;
            }
        }).start();

private void fileCreate(String strFile) {
        try {
            InputStream ExIPs = new FileInputStream("\\\\path\\IPAddresses.xls");
            Workbook wb = WorkbookFactory.create(ExIPs);
            Sheet sheet = wb.getSheetAt(0);
            Row row1 = sheet.getRow(1);
            Cell cell1 = row1.getCell(2);
            cell1.setCellValue(intStr);
            Row row2 = sheet.getRow(2);
            Cell cell2 = row2.getCell(2);
            cell2.setCellValue(strOct);
            FileOutputStream fileOut = new FileOutputStream(strFile);
            wb.write(fileOut);
            ExIPs.close();
            fileOut.close();
            Process exec = Runtime.getRuntime().exec("\"C:\\Program Files (x86)\\Microsoft Office\\OFFICE11\\EXCEL.EXE\" /r " + strFile);
            exec.waitFor();

        } catch (Exception e) {
            return;
        }
    }

答案 1 :(得分:-1)

通常当你等待某事然后想要得到通知时......你使用观察者模式......

https://en.wikipedia.org/wiki/Observer_pattern