yuxianqiandi
2011-09-26 10:32
浏览 214
已采纳

新手问一个线程同步问题

//最近一两天突然想写一个可以从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条回答 默认 最新

  • _1_1_7_ 2011-09-26 10:55
    已采纳
        InputStream is=pro.getInputStream();
        while(is.read()!=-1);
    
    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • DreamZhong 2011-09-26 10:42

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

    评论
    解决 无用
    打赏 举报
  • DreamZhong 2011-09-26 10:53

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

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题