在Web应用程序中使用ThreadPoolExecutor

时间:2013-11-08 19:37:18

标签: java multithreading concurrency

我计划在我的某个网络应用中使用 ThreadPoolExecutor ,但我有类似的查询 如果我的ThreadPoolExecutor在应用程序没有获取请求时关闭/终止该怎么办?我是否必须检查状态并启动新的 ThreadPoolExecutor 对象。当实际发生自动终止/关闭时?

当我在测试场景下运行时,它没有关闭/终止。 我的场景如下: 我的网络应用程序连续获取请求读取参数,发送ACK并使用参数进行进一步处理。

public static void main(String[] args) {
    ThreadPoolTester tt = new ThreadPoolTester();
    BlockingQueue<Runnable> workQueue = new SynchronousQueue<Runnable>();

    ThreadPoolExecutor ex = new ThreadPoolExecutor(10, Integer.MAX_VALUE, 10, TimeUnit.MILLISECONDS, workQueue);
    while(true){
    tt.executor(ex);
    try {
        Thread.sleep(10000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }


}

public void executor(ThreadPoolExecutor ex){

    ArrayList<Future<String>>  tasks= new ArrayList<Future<String>>();
    if(ex.isShutdown()){
        System.out.println("threadpool is shutdown");
    }
    if(ex.isTerminated()){
        System.out.println("threadpool is terminated");
    }
    for(int i=0; i<100; i++){           
    Future<String> task = ex.submit(new MyTask(i));
    tasks.add(task);
    System.out.println("Pool Size "+ex.getPoolSize());
    }

    for (int i = 0; i < 100; i++) {
        try{
        System.out.println("Retunr value: "+ tasks.get(i).get());           
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
    System.out.println("final size "+ex.getPoolSize());
}

1 个答案:

答案 0 :(得分:1)

ThreadPoolExecutor本身永远不会关闭。但是,如果它们的空闲时间超过您指定的保持活动时间,它将关闭其线程。但它会自动按需创建新线程。

所以你不必做任何事情。

如果您甚至希望线程永远保持活动,您可以使用固定大小的线程池,但当然这不可扩展。