2013-05-05 3 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() Thread 대신 void를 반환합니다. –

+0

고마워요 @ user2351730, 고맙습니다. 기꺼이 도와 드리겠습니다. –

관련 문제