public class FileFinder {
private static Timer timerThread;
private static Find findThread;
public static void main(String[] args) {
timerThread = new Timer(Integer.parseInt(args[3]));
findThread = new Find(args[0], args[1], args[2]);
Thread timer = new Thread(timerThread);
Thread finder = new Thread(findThread);
finder.start();
timer.start();
}
}
注意:查找程序将找到用户输入的文件 timer应该与find线程并行运行,如果指定的超时超过两个线程必须退出。
方法我跟随: -
TIMER
@Override
public void run() {
newTime = startTime;
System.out.println("Timer Running\n");
System.out.println("TimeOut is:" + timeOut +"\n");
while(true){
if(newTime < startTime+timeOut){
newTime=startTime+ System.currentTimeMillis();
}
else{
break;
}
}
System.err.println("Cannot find");
System.exit(-1);
}
查找
@Override
public void run() {
System.out.println("Running find");
File searchDir = new File(this.searchLocation);
UserFilter filter = new UserFilter(searchKeyword,searchType,pathOfSearchedFiles);
/*for(String file : searchDir.list(filter)){
pathOfSearchedFiles.add(searchDir+File.separator+file);
}*/
searchDir.list(filter);
for(String f: pathOfSearchedFiles){
System.out.println(f);
}
}
我的查找线程没有时间工作,并且计时器线程正在退出应用程序。
请建议。
答案 0 :(得分:2)
我认为你的while循环有问题:
while(startTime < startTime+timeOut){
startTime=startTime+ System.currentTimeMillis();
}
这是一个无限循环......
答案 1 :(得分:2)
您的计时器功能无法达到预期效果。它将当前时间添加到开始时间,然后请求它比自身大(除非超时为负)。你可能会遇到溢出,这就是为什么它要早退出
而是尝试类似:
@Override
public void run() {
System.out.println("Timer Running");
long endTime = System.currentTimeMillis() + timeOut;
while(System.currentTimeMillis() < endTime){
try{
Thread.sleep(500); //Set the granularity here to a suitable value
catch(InterruptedException e){
}
}
System.err.println("Cannot find");
System.exit(-1);
}
}
答案 2 :(得分:0)
您可以将查找线程作为参数添加到计时器中进行管理:
主要:
public class FileFinder {
private static Timer timerThread;
private static Find findThread;
public static void main(String[] args) {
findThread = new Find(args[0], args[1], args[2]);
Thread finder = new Thread(findThread);
timerThread = new Timer(Integer.parseInt(args[3]),finder); // <-- here add parameter
finder.start();
timer.start();
}
}
<强> TIMER 强>
// You have finder as an attribute Thread finder;
@Override
public void run() {
newTime = startTime;
System.out.println("Timer Running\n");
System.out.println("TimeOut is:" + timeOut +"\n");
while(true){
if(newTime < startTime+timeOut){
newTime=startTime+ System.currentTimeMillis();
}
else{
break;
}
}
if(finder != null)
finder.interrupt(); // <--- here you interrupt finder thread
System.err.println("Cannot find");
System.exit(-1);
}
答案 3 :(得分:0)
注意:没有办法立即停止线程。你应该检查周期中的状态。如果是这样,为什么你决定有单独的线程来阻止finder线程?如果超过时间,您可以在取景器循环中定时并退出。像:
@Override
public void run() {
System.out.println("Running find");
File searchDir = new File(this.searchLocation);
UserFilter filter = new UserFilter(searchKeyword,searchType,pathOfSearchedFiles);
/*for(String file : searchDir.list(filter)){
pathOfSearchedFiles.add(searchDir+File.separator+file);
}*/
searchDir.list(filter);
for(String f: pathOfSearchedFiles){
if (System.currentTimeMillis() >= stopTime) {
break;
}
System.out.println(f);
}
}