新手问一个线程同步问题

问题描述

//最近一两天突然想写一个可以从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执行完毕在继续往下执行呢?参阅了网上的很多方法,还是不行... 问题补充:<div class="quote_title">Wind_ZhongGang 写道</div><div class="quote_div">完全没有领会你的意思。你的方法执行都是在主线程中,并且方法的执行本身并不是另一个线程,是按照顺序执行的,完全可以达到你所想要的效果,根本不存在线程同步的问题啊。</div><br /><br />谢谢你的回复,我的问题是还没有待pro执行完毕,也就是解压出来的就是一个空壳子,里面并没有我想要的文件,而主程序继续往下执行getFile方法,因而没有得到想要的文件,这点可以在getFile里面加上System.out.println(f)打印来证实,首次发帖,恐词不达意,勿怪

解决方案

InputStream is=pro.getInputStream();while(is.read()!=-1);
解决方案二:
引用谢谢你的回复,我的问题是还没有待pro执行完毕,也就是解压出来的就是一个空壳子,里面并没有我想要的文件,而主程序继续往下执行getFile方法,因而没有得到想要的文件,这点可以在getFile里面加上System.out.println(f)打印来证实,首次发帖,恐词不达意,勿怪确实没有看出来你这里面有多线程,之所以没有解压到你想要的文件,请检查你获取文件的时候是否正确?
解决方案三:
完全没有领会你的意思。你的方法执行都是在主线程中,并且方法的执行本身并不是另一个线程,是按照顺序执行的,完全可以达到你所想要的效果,根本不存在线程同步的问题啊。

时间: 2024-10-02 04:45:10

新手问一个线程同步问题的相关文章

php-PHP新手问一个小问题,有时间前辈帮帮忙!小弟在此感激不尽!

问题描述 PHP新手问一个小问题,有时间前辈帮帮忙!小弟在此感激不尽! php写的一个简单提交数据代码没提示错误 但是数据库添加不进去 index.php代码如下: <?php require_once 'conn.php'; $id = $_POST[userid]; $name = $_POST[username]; $content = $_POST[content]; $sql = "insert into all(userid,name,content)values('$id',

新手问一个关于生成网页的问题

问题描述 我是个新手,有很多不懂的地方..想请教一下..例如象论坛这样的网站,点击发帖后怎么生成所发的帖子的页面呢,和新闻系统不同的是不能生成静态的HTML,那样在帖子页面中就没有论坛该有的功能了..这个该怎么实现呢... 解决方案 解决方案二:发贴后内容是写库的,怎么生成页可自己定,生成时是读库的,当然也可使用其他方案解决方案三:原先听谁说好象CSDN是写XML,效率我不知道,不过我就知道CSDN现在可没以前快了.当然,你也可以写库.解决方案四:不明白你的意思,你的意思是只想生成静态页面还是说

新手问一个开发效率的问题

问题描述 不是程序运行效率,是开发快慢,现在周围朋友说PC端软件C#做界面算是很快的了,请问C#做界面速度有多快?假如做一个类似360的界面,比HTML+CSS快多少?有没有C#和HTML前端都接触过的朋友说一下 解决方案 解决方案二:这种问题没任何意义,如果一个有皮肤之类的控件,那可能可以很快就开发出来,通过wpf和winform不同实现方式,那么wpf明显要轻松,然而wpf中很擅长用blend的不见得有多少,所以可能这方面又要很麻烦,当然,说到底,都是人的问题解决方案三:C#和HTML+CS

新手问一个判断数据库数据变化的问题

问题描述 我是C#的新手,最近在做一个小程序.用DataGridView控件.读取数据库的数据,然后通过foreach(DataRowiinDataTable.Rows)来得到每一行我想要的数据.但是我现在想要时时刷新数据,然后判断数据与之前相比是上升,下降还是不变.如何写一个函数可以实现存储每一行对应的数据,然后等数据库的新数据来跟之前存储的数据相比较.(假设我的数据库现在的数据是时时更新的.) 解决方案 解决方案二:有没有想过在数据库层做一个存储过程(或者触发器)来实现你的功能呢?

新手问一个文件move问题

问题描述 我想实现一个拷贝功能,获取fdir里边的文件,move到tdir里边,如果遇见同名文件,则自动命名文件名+1,比如fdir里边有1,2,3,4四个文件,把他们move到tdir里边,并且改名为a1.a2.a3.a4,如果tdir里边有a2了,则自动跳过a2直接命名为a3,代码如下,不成功啊,老是提示文件已存在,改怎么处理呢?if(!Directory.Exists(tdir)){Directory.CreateDirectory(tdir);}intnnn=1;string[]file

新手问一个在C#里读取 sql 的view 和 table之间的transform出现的行数问题

问题描述 我在做一个transform的项目,以前用的是一个view,现在一步步转换成使用table,在C#里面原有的计算方法全部都会有所改变,问题发生在view里面使用view.AddNew(),加新建一行数据的时候数据库里面是没有写入的.(行号一直都是0)直到使用Factory.Save();之后就会在SQL新建这一行数据.(行号变成1)然而在原本unittest单元测试的时候,往往不会使用Factory.save();来写入数据但是从view转换成table后,一旦使用了自定义的metho

新手问一个关于geoserver的问题

问题描述 请问一下各位大大像udig中的createpoint(line.polygon)Tool和deletefeature这两个功能(如下图红圈部分)能用geoserver+openlayers实现吗?比如说我搭好了geoserver服务,发布了一张点(线.面)类型的地图,我在web端能不能实现点击地图然后添加一个点到地图上这个功能,我不是指在openlayers上画点,而是修改shp这个发布的地图.如果可以实现的话,是用wfs吗?请各位大大指教,谢谢. 解决方案 本帖最后由 yone20

java-新手问一个很奇怪的问题

问题描述 新手问一个很奇怪的问题 class Demo { int num = 1; int add = 2; Demo() { num = 5; add = 6; } void show() { System.out.println("Fu num="+num+" Fu add="+add); } } class DemoA extends Demo { DemoA() { this.num = 3; this.add = 4; } void show() { S

cocos2d-x-新手问一个关于cocos2DX基于PC编程的问题

问题描述 新手问一个关于cocos2DX基于PC编程的问题 由于一些需求,我需要把已经读取的精灵(Sprite)存储到硬盘里面,求大神给说说要用到那些函数 解决方案 存储到硬盘.是想保存精灵的各种属性么??可以用XML或者数据库