2015-03-03 49 views
2

该代码只要处理某些文件,只要它们存在于预设文件夹中即可。但是,在Eclipse上运行时,如果文件夹中没有文件,线程将被终止,但通常会在稍后添加文件。为了保持它始终运行,我在run函数中添加了一个无限循环。这有效,但有没有其他的方式来实现这一点,以便它使用较小的内存? 下面的代码: -如何防止暂时不满足条件时线程被终止?

import java.io.*; 

public class AddService extends Thread{ 

public void run(){ 
    while(true){ 
    Handler obj=new Handler(); 
    File[] listOfFiles=obj.getFileList(); 
    if(listOfFiles.length>0) 
    {   
     obj.process(listOfFiles); 
    } 
    else{ 
     try{ 

      AddService.sleep(1000); 
     } 
     catch(Exception ex){ 
     } 
     } 
    } 
    } 

public static void main(String args[]){ 
    AddService t1=new AddService();  
     t1.start();  
} 
} 
+1

你可能可以有一个处理程序,并将while移动到'while(obj.getFileList()。length> 0)'。或者使用计时器。 – 2015-03-03 11:19:11

回答

3

你可以做同样的事情由ScheduledExecutorService

ScheduledExecutorService s = Executors.newScheduledThreadPool(1); 
s.schedule(myrunnable, 1000, TimeUnit.SECONDS); 

要检查是否存在的任何文件。如果允许使用第三方库,您可以观察到目录中的更改使用FileAlterationObserver

1

一个不错的方法是使用BlockingQueue(来自Java API)。 一个线程尝试从队列中取出一个文件,等待提供一个文件。

fileQueue = new LinkedBlockingQueue<>(); 
threadPool = Executors.newFixedThreadPool(1); 
threadPool.submit(new Runnable() { 

    @Override 
    public void run() { 

     while (true) 
     { 
      //Block and wait for a file 
      File file = fileQueue.take(); 
      // Do your stuff here 
     } 
    } 
} 

您可以在一个循环中,一旦出现包装这个代码,等待文件和,把它们放在: 一个线程(或线程)都在预定的方式试图发现新的文件执行排队,以便被阻止的线程可以为您处理它们。

相关问题