我的程序是这样的ThreadPool threadPool = new ThreadPoolExecutor(2, 30, 1,
TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1),
new ThreadPoolExecutor.CallerRunsPolicy());          //建立线程池for(int i=0;i<2000;i++){threadPool.submit(一个线程);
threadPool.submit(一个线程);
threadPool.submit(一个线程);
threadPool.submit(一个线程);}
try{
boolean loop = true;
do{
                out.print("still checking......");
loop = !threadPool.awaitTermination(5, TimeUnit.SECONDS);  
       } while(loop);  
}catch(Exception e){
}先寻立线程池,然后再提交很多线程,再用awaitTermination 检查全部线程运行完了没有,但现在有一个问题,我在自己的机子上运行,其中有三个线程一直不能结束,要等很久才能结束,也就是说,输出了很多次
still checking......之后,这些线程才结束,但其他线程很快就结束了,不过最后,程序还是能正常完后但在服务器上运行,不一会不出现
The   server   is   temporarily   unable   to   service   your   request   due   to   maintenance   downtime   or   capacity   problems.   Please   try   again   later.
这个错误,是什么原因到致呢还有一个问题想问,如果一个线程运行太久了,在线程池里面怎么去获取这个线程并结束它?

解决方案 »

  1.   

    很可能由于队列太小,导致线程太多了建议把线程池定义改成
    ThreadPool threadPool = new ThreadPoolExecutor(2, 30, 2000,
    TimeUnit.SECONDS, new ArrayBlockingQueue <Runnable>(1),
    new ThreadPoolExecutor.CallerRunsPolicy())
      

  2.   

    不好意思,前面的定义写错了,正确如下ThreadPool threadPool = new ThreadPoolExecutor(2, 30, 10,
    TimeUnit.SECONDS, new ArrayBlockingQueue <Runnable>(2000),
    new ThreadPoolExecutor.CallerRunsPolicy()) 
      

  3.   

    Service Temporarily UnavailableThe server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.
    请问这个错误,到底有哪些原因?
      

  4.   

    但是网上也有说,是tomcat限制了并发数之类的有没有可能我的线程太多,还是?因为我每打开一个线程,都要求服务器建立一个 url connection ,然后服务器再从得到的内容取数据
      

  5.   

    Service Temporarily Unavailable  表示服务器很忙按照你的池程式设置 30 个线程不算大 ,是不是还有其它地方建了线程
      

  6.   

    tomcat限制了并发数这个没算,你自己的服务器又没有很多在访问吧
      

  7.   

    肯定还有其它线程了,只不过是几个而已,我用jprofile去查看过了,真的不知道什么原因啊,至于tomcat内存,我查了,只用了50M
      

  8.   

    对啊,并发数,我也觉得跟这个无关其它程序都在这个tomcat里面运行,都挺好的,但只要我这个程序一运行,就出现Service Temporarily Unavailable 错误
      

  9.   

    你到底要执行多少线程,线程池里有多少线程,看看调大tomcat的占用内存.看看有没有其它的异常信息
      

  10.   

    线程可能有几千个,但线程池建立,我设置最大才能建立30个线程,所以其它的都在等待啊,至于内存out.print("JVM MAX MEMORY: " + Runtime.getRuntime().maxMemory()/1024/1024+"M");
    out.print("JVM IS Total MEMORY:" + Runtime.getRuntime().totalMemory()/1024/1024+"M");
    out.print("JVM IS USING MEMORY:" + (Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory())/1024/1024+"M");
    out.print("JVM IS FREE MEMORY:" + Runtime.getRuntime().freeMemory()/1024/1024+"M");查了也就50M左右,但tomcat有1G内存啊
      

  11.   

    我觉得可能是不是因为这个策略ThreadPoolExecutor.CallerRunsPolicy(),导致线程太大
      

  12.   

    但是如果改为其它的话, 一下子就完了,其中很多的都没有处理的,所以我只能用这个ThreadPoolExecutor.CallerRunsPolicy()
      

  13.   

    你一下子压了太多到队列里面又不是FIFO的,某几个一直等不到处理也正常。从程序逻辑方面考虑优化下吧
      

  14.   

    但是如果改为其它的话, 一下子就完了,其中很多的都没有处理的,所以我只能用这个ThreadPoolExecutor.CallerRunsPolicy()这就说明你的队列不够大,像你的任务这么多,必须队列容量要大于你的任务数量
      

  15.   

    那如果,一个程序,在tomcat上面运行很长一段时间,比如,一个小时,tomcat 会不会崩溃的, 有没有什么地方是限制多少时间就超时之类的?
      

  16.   

    在tomcat上面运行很长一段时间,比如,一个小时,tomcat 会不会崩溃的tomcat如果一个小时崩溃,那就说明它太差了,tomcat一般是资源用完了,比如内存用完了,关于内存用完可能是由于程序问题导致的,这就要改进程序,也可能是当前的硬件满足不了你的需求
      

  17.   

    有没有什么地方是限制多少时间就超时之类不知道你指什么超时,tomcat可以设置会话的超时,tomcat 的 Connector  也可以设置超时,但好像这个与你无关
      

  18.   

    php 有个执行页面超时的啊,我想问下tomcat有没有这个?还有,谢谢ghchen,都是你在关注并回答我的问题,谢谢你
      

  19.   

    试试 connectionTimeout  
    <!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
    <Connector URIEncoding="UTF-8" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" enableLookups="false" maxHttpHeaderSize="8192" maxSpareThreads="75" maxThreads="150" minSpareThreads="25" port="7777" redirectPort="8443"/>