我认为在一个单独的方法中创建子进程并从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)。
答案 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)
通常当你等待某事然后想要得到通知时......你使用观察者模式......