2013-05-05 65 views
2

當我測試了一個簡單的生產者/消費者示例時,我得到了一個非常奇怪的結果,如下所示。在java中使用main和junit獲取不同的結果

  1. 如果我用main()來測試下面的代碼,我會得到正確和預期的結果。
  2. 但我只能正確地獲取第一個目錄,其餘的作品被JUnit丟棄。

確切原因是什麼?

工作代碼

import java.io.File; 
import java.util.concurrent.BlockingQueue; 
import java.util.concurrent.LinkedBlockingQueue; 

import org.junit.Test; 

public class TestProducerAndConsumer { 

    public static void main(String[] args) { 
     BlockingQueue<File> queue = new LinkedBlockingQueue<File>(1000); 

     new Thread(new FileCrawler(queue, new File("C:\\"))).start(); 
     new Thread(new Indexer(queue)).start(); 
    } 
} 

糟糕的代碼:

import java.io.File; 
import java.util.concurrent.BlockingQueue; 
import java.util.concurrent.LinkedBlockingQueue; 

import org.junit.Test; 

public class TestProducerAndConsumer { 

    @Test 
    public void start2() { 
     BlockingQueue<File> queue = new LinkedBlockingQueue<File>(1000); 

     new Thread(new FileCrawler(queue, new File("C:\\"))).start(); 
     new Thread(new Indexer(queue)).start(); 
    } 
} 

其他功能代碼:

import java.io.File; 
import java.util.Arrays; 
import java.util.concurrent.BlockingQueue; 

public class FileCrawler implements Runnable { 
    private final BlockingQueue<File> fileQueue; 
    private final File root; 
    private int i = 0; 

    public FileCrawler(BlockingQueue<File> fileQueue, File root) { 
     this.fileQueue = fileQueue; 
     this.root = root; 
    } 

    @Override 
    public void run() { 
     try { 
      craw(root); 
     } catch (InterruptedException e) { 
      System.out.println("shit!"); 
      e.printStackTrace(); 
      Thread.currentThread().interrupt(); 
     } 

    } 

    private void craw(File file) throws InterruptedException { 
     File[] entries = file.listFiles(); 
     //System.out.println(Arrays.toString(entries)); 
     if (entries != null && entries.length > 0) { 
      for (File entry : entries) { 
       if (entry.isDirectory()) { 
        craw(entry); 
       } else { 
        fileQueue.offer(entry); 
        i++; 
        System.out.println(entry); 
        System.out.println(i); 
       } 
      } 
     } 

    } 

    public static void main(String[] args) throws InterruptedException { 
     FileCrawler fc = new FileCrawler(null, null); 
     fc.craw(new File("C:\\")); 
     System.out.println(fc.i); 
    } 

} 




import java.io.File; 
import java.util.concurrent.BlockingQueue; 

public class Indexer implements Runnable { 

    private BlockingQueue<File> queue; 

    public Indexer(BlockingQueue<File> queue) { 
     this.queue = queue; 
    } 

    @Override 
    public void run() { 
     try { 
      while (true) { 
       indexFile(queue.take()); 
      } 
     } catch (InterruptedException e) { 
      Thread.currentThread().interrupt(); 
     } 
    } 

    private void indexFile(File file) { 
     System.out.println("Indexing ... " + file); 

    } 
} 

回答

3

JUnit的大概是人降低JVM &線程終止,一旦測試完成 - 因此您的線程無法完成工作。

嘗試等待線程 '加入':

Thread crawlerThread = new Thread(new FileCrawler(queue, new File("C:\\"))); 
Thread indexerThread = new Thread(new Indexer(queue)); 
crawlerThread.start(); 
indexerThread.start(); 
// 
// wait for them to finish. 
crawlerThread.join(); 
indexerThread.join(); 

這應該幫助。

..另一件可能出錯的事情是,日誌輸出(通過Log4J)有時可能在執行結束時被截斷;沖洗&暫停可以幫助。但我認爲這不會影響你。

+1

它的工作,謝謝!您的代碼需要一個小的更改。 new Thread()。start()返回void而不是Thread。 – 2013-05-05 12:13:08

+0

謝謝@ user2351730,修正:)很高興我能幫忙。 – 2013-05-06 01:08:09

相關問題