2015-03-03 76 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 
     } 
    } 
} 

您可以在一個循環中,一旦出現包裝這個代碼,等待文件和,把它們放在: 一個線程(或線程)都在預定的方式試圖發現新的文件執行排隊,以便被阻止的線程可以爲您處理它們。