代码之家  ›  专栏  ›  技术社区  ›  Soham Banerjee

当条件暂时不满足时,如何防止线程终止?

  •  2
  • Soham Banerjee  · 技术社区  · 11 年前

    该代码只处理预设文件夹中存在的某些文件。但是当在Eclipse上运行时,当文件夹中没有文件时,线程将终止,尽管文件通常会在稍后添加。为了使它始终运行,我在run函数中添加了一个无限while循环。这是可行的,但有没有其他方法可以实现这一点,从而减少内存消耗? 代码如下:-

    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();     
    }
    }
    
    3 回复  |  直到 11 年前
        1
  •  3
  •   SMA    11 年前

    你也可以这样做 ScheduledExecutorService

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

    检查文件是否存在。另外,如果允许您使用第三方库,您可以使用 FileAlterationObserver

        2
  •  1
  •   jbx    11 年前

    除了其他答案建议的方法外,您还可以使用NIO WatchService 由JDK本身提供。

    您可以遵循教程 here ,显示了如何监视目录中的更改(添加的新文件、修改的现有文件或删除的文件)。

    http://docs.oracle.com/javase/tutorial/essential/io/notification.html

    因此,您可以检查目录中是否有任何文件,如果没有,则创建一个观察程序,在发生更改时通知您。

        3
  •  1
  •   Victor    11 年前

    一个很好的方法是使用BlockingQueue(来自JavaAPI)。 一个线程尝试从队列中获取一个文件,等待提供一个文件。 一个线程(或多个线程)以计划的方式执行,试图发现新文件:

    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
             }
       }
    }
    

    您可以将这些代码包装在一个循环中,等待文件,一旦文件出现,就将它们放入队列中,以便被阻止的线程可以为您处理它们。