2014-12-02 99 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之类的内容。