2014-12-02 97 views
0

下面內運行的多個線程是使用ScheduledExecutorService的一個單元測試來執行調度運行的每一秒:從一個單元測試

import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.TimeUnit; 

import org.junit.Test; 

public class ConcurrentRequestSimulator { 

    private static final int NUMBER_REQUESTS = 4; 

    @Test 
    public void testGetToDoList() { 

     try { 
      ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(10); 
      scheduler.scheduleAtFixedRate(new RequestThreadInvoker(), 0, 1, TimeUnit.SECONDS); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    private final class RequestThreadInvoker implements Runnable { 

     public void run() { 

      ExecutorService es = Executors.newCachedThreadPool(); 
      for (int i = 1; i <= NUMBER_REQUESTS; i++) { 
       es.execute(new RequestThread()); 
      } 
      es.shutdown(); 

      while (!es.isTerminated()) { 

      } 

     } 
    } 

    private final class RequestThread implements Runnable { 

     public void run() { 
      try { 
       System.out.println("in RequestThread"); 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

} 

System.out.println("in RequestThread");RequestThread沒有出現要被調用的行,沒有任何輸出控制檯。 我認爲問題是,由於測試運行到完成,它會導致scheduler停止調度?是否可以更新測試,以便scheduler未終止並且RequestThreadInvoker每秒重複調用一次?

RequestThreadInvoker我創建了ExecutorService的新實例。這是否會導致問題?

回答

0

Thread.sleep(99000);添加到測試結束會導致測試等待99秒,這足以讓測試運行。

0

當線程池正在運行時,您將需要阻止主測試線程(睡眠/等待)。要從單獨的線程之一執行斷言,您可以使用類似concurrentunit之類的內容。