newCachedThreadPool()
能reuse的线程,必须是timeout IDLE内的池中线程,缺省timeout是60s,超过这个IDLE时长,线程实例将被终止及移出池。
  注意,放入CachedThreadPool的线程不必担心其结束,超过TIMEOUT不活动,其会自动被终止。

解决方案 »

  1.   

    哦,意思是,放入newCachedThreadPool()的线程是在一定时间内被动终止咯?
    但是我CountDownLatch是用于线程等待的,既然能打印出A那么说明线程池的线程已经执行完毕,而且主线程也执行到最末尾了,为什么没被终止呢?
      

  2.   


    很明显是你没关闭线程池, 你在B的main方法最后加上:
    t.shutdown();
      

  3.   

    虚拟机实例停止运行的条件是:只有守护线程时才退出;显然,即使main线程退出,若线程池还有非守护线程,自然JVM还在运行了;
      

  4.   

    线程池,简而言之,就是线程的池,在池中容纳一定数量的线程,有任务要执行时,从池中取出一个线程,执行所需的任务,执行完成后,线程并不是直接结束,而是等待下一个任务的到来,这样可以避免每次有任务需要执行时都要重复创建线程的开销。当然线程池中的线程并不是永不结束,可以设置超时时间,如果一个空闲的线程等待了超过超时时间还没有任务需要执行,那么线程就自动结束,也就达到了从线程池中删除线程的目的。
    具体可以看下ThreadPoolExecutor中的:
    Runnable getTask() {
            for (;;) {
                try {
                    int state = runState;
                    if (state > SHUTDOWN)
                        return null;
                    Runnable r;
                    if (state == SHUTDOWN)  // Help drain queue
                        r = workQueue.poll();
                    else if (poolSize > corePoolSize || allowCoreThreadTimeOut)
                        r = workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS);
                    else
                        r = workQueue.take();
                    if (r != null)
                        return r;
                    if (workerCanExit()) {
                        if (runState >= SHUTDOWN) // Wake up others
                            interruptIdleWorkers();
                        return null;
                    }
                    // Else retry
                } catch (InterruptedException ie) {
                    // On interruption, re-check runState
                }
            }
        }