当用concurrent的threadpoolexecute类时,会有一个blockqueue,当我的请求大于blockqueue的最大容量的时候,或者说大于maxpoolsize的时候,请求就会排队,第一个排队的请求假设为A,这个时候如果线程池中一个线程完成任务后就会处理A,但如果线程池中一个线程抛出异常了,这时候A就被丢弃了,线程会处理第二个排队的请求,而A就会被忽略了,怎么办呢??????????

解决方案 »

  1.   

    不会发生这种事情吧?是不是A本身抛出了异常?建议你在A的入口处print一些东西看看。
      

  2.   

    我贴些代码给各位达人看看哈:
    package test; 
     
    import java.io.Serializable; 
     
    public class Process implements Serializable, Runnable { 
      /** 
       * 
       */ 
      private static final long serialVersionUID = 1; 
      private String xml=""; 
       
     
      public Process(String xml) { 
        this.xml=xml; 
      } 
     
      public void run() { 
        try { 
          System.out.println(xml); 
          Thread.sleep(5000); 
          throw new Exception(); 
          }catch(Exception e) { 
          e.printStackTrace(); 
        } 
      } 
    }
    *************************************package test; 
     
    import java.util.concurrent.ArrayBlockingQueue; 
    import java.util.concurrent.BlockingQueue; 
    import java.util.concurrent.RejectedExecutionHandler; 
    import java.util.concurrent.ThreadPoolExecutor; 
    import java.util.concurrent.TimeUnit; 
     
    public class Tmp extends Thread { 
      // private ExecutorService pool = null; 
      private static ThreadPoolExecutor pool = null; 
      private static final int CORE_POOL_SIZE = 1; 
      private static final int MAX_POOL_SIZE = 3; 
      private static final long KEEPALIVE_TIME = 60; 
      private static final TimeUnit TIME_UNIT = TimeUnit.SECONDS; 
      private static final int QUEUE_CAPACITY = (CORE_POOL_SIZE + MAX_POOL_SIZE) / 2; 
      private static BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>( 
          QUEUE_CAPACITY); 
      private static RejectedExecutionHandler rejectedExecutionHandler = new ThreadPoolExecutor.DiscardOldestPolicy(); 
     
      static { 
        System.out.println("程序启动中... ..."); 
        System.out.print("程序初始化... ..."); 
        pool = new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, 
            KEEPALIVE_TIME, TIME_UNIT, workQueue, rejectedExecutionHandler); 
         
          System.out.println(" [ok]"); 
      } 
     
      public void start() { 
          pool.execute(new Process("1111111111")); 
          pool.execute(new Process("2222222222")); 
          pool.execute(new Process("3333333333")); 
          pool.execute(new Process("4444444444")); 
          pool.execute(new Process("5555555555")); 
          pool.execute(new Process("6666666666")); 
          pool.execute(new Process("7777777777")); 
          pool.execute(new Process("88888888888")); 
          System.out.println("zzzzzzzz"); 
      } 
     
      public static void main(String args[]) { 
        new Tmp().start(); 
      } 
    }