新手问一个线程同步问题

//最近一两天突然想写一个可以从rar文件中提取文件的程序,具体的代码如下:
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

 

public class Test {
 private static ArrayList<File> myFile = new ArrayList<File>();
 private String flag = "flag";
 private ArrayList<File> tempFile = new ArrayList<File>();
 private Process pro;

 public void rarFile(String src, String name) {// src表示当前路径,
  Pattern p = Pattern.compile(".*\\.rar$");
  Matcher m = p.matcher(name);

  if (m.matches()) {
   synchronized (this) {
    try {

     //解压文件
     pro = Runtime.getRuntime().exec(
       "cmd /c start winrar x " + src + "\\" + name
         + " -r " + "" + src);
    } catch (IOException e) {
     e.printStackTrace();
    }
             /*如何让主线程等待pro执行玩后在继续执行呢?*/
    int index = name.lastIndexOf(".");
    String fileName = name.substring(0, index);
    File ff = new File(src + "\\" + fileName);
    getFile(ff);
    tempFile.add(ff);

   }
  }
 }

  //获取文件

 public void getFile(File f) {
  // System.out.println(f);
  if (f.isDirectory()) {
   File[] list = f.listFiles();
   for (int i = 0; i < list.length; i++)
    getFile(list[i]);
  } else {
   String name = f.getName();
   String pattern = ".*\\.rar$|.*\\.pdf$";//提取pdf文件和rar文件
   Pattern p = Pattern.compile(pattern);
   Matcher m = p.matcher(name);
   if (m.matches()) {
    String str = ".*\\.pdf$";
    p = Pattern.compile(str);
    m = p.matcher(name);
    if (m.matches()) {
     myFile.add(f);

    } else {
     rarFile(f.getParent(), f.getName());
    }
   }
  }
 }

 public static void main(String[] args) {
  Test tt = new Test();
  tt.getFile(new File("f:\\test"));
  Iterator<File> it = myFile.iterator();
  while (it.hasNext())
   System.out.println(it.next());

 }

}
如何使主线程等待pro执行完毕在继续往下执行呢?参阅了网上的很多方法,还是不行...

3个回答

    InputStream is=pro.getInputStream();
    while(is.read()!=-1);

完全没有领会你的意思。你的方法执行都是在主线程中,并且方法的执行本身并不是另一个线程,是按照顺序执行的,完全可以达到你所想要的效果,根本不存在线程同步的问题啊。

[quote]谢谢你的回复,我的问题是还没有待pro执行完毕,也就是解压出来的就是一个空壳子,里面并没有我想要的文件,而主程序继续往下执行getFile方法,因而没有得到想要的文件,这点可以在getFile里面加上System.out.println(f)打印来证实,首次发帖,恐词不达意,勿怪[/quote]
确实没有看出来你这里面有多线程,之所以没有解压到你想要的文件,请检查你获取文件的时候是否正确?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐