• ThreadPoolExecutor异常处理


    java.util.concurrent包中的ThreadPoolExecutor,提供了java语言的线程池,你可以提交一个返回结果的任务(submit(Callable),返回Future),或者执行一个不返回结果的任务(execute(Runnable)),但提交的任务可能会抛异常,这就需要处理异常:

    1. 对于submit的任务,框架会将异常保持在future里,并包装在ExecutionException里,当调用Future.get()时,再次throw,这时可以调用ExecutionException.getCause()获取包装的exception,这种情况下,设置UncaughtExceptionHandler也不会被调用。

    2. 对应execute的任务,会直接throw,可以设置一个UncaughtExceptionHandler,例如:

    Java代码  收藏代码
    1. import java.lang.Thread.UncaughtExceptionHandler;  
    2. import java.util.Random;  
    3. import java.util.concurrent.CancellationException;  
    4. import java.util.concurrent.ExecutionException;  
    5. import java.util.concurrent.ExecutorService;  
    6. import java.util.concurrent.Future;  
    7. import java.util.concurrent.LinkedBlockingQueue;  
    8. import java.util.concurrent.ThreadFactory;  
    9. import java.util.concurrent.ThreadPoolExecutor;  
    10. import java.util.concurrent.TimeUnit;  
    11. import java.util.concurrent.atomic.AtomicInteger;  
    12.   
    13. public class ExecutorServiceDemo {  
    14.   
    15.     public static void testExecute() {  
    16.         ExecutorService executors = new ThreadPoolExecutor(10, 20, 60, TimeUnit.SECONDS,  
    17.                 new LinkedBlockingQueue<Runnable>(), new ThreadFactory() {  
    18.                     final AtomicInteger threadNumber = new AtomicInteger(1);  
    19.   
    20.                     public Thread newThread(Runnable r) {  
    21.                         Thread t = new Thread(Thread.currentThread().getThreadGroup(), r, "topPatternTasklet-thread"  
    22.                                 + (threadNumber.getAndIncrement()));  
    23.                         t.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {  
    24.   
    25.                             public void uncaughtException(Thread t, Throwable e) {  
    26.                                 System.out.println(e);  
    27.                             }  
    28.                               
    29.                         });  
    30.                         return t;  
    31.                     }  
    32.                 }, new ThreadPoolExecutor.CallerRunsPolicy());  
    33.   
    34.         final Random r = new Random();  
    35.         for (int i = 0; i < 10; ++i) {  
    36.             executors.execute(new Runnable() {  
    37.   
    38.                 public void run() {  
    39.                     try {  
    40.                         int ri = r.nextInt(1000);  
    41.                         Thread.sleep(ri);  
    42.                         if (ri % 3 == 0) {  
    43.                             System.out.println("ri:" + ri);  
    44.                             throw new RuntimeException("haha error!");  
    45.                         }  
    46.                         System.out.println(Thread.currentThread());  
    47.                     } catch (InterruptedException e) {  
    48.                     }  
    49.                 }  
    50.             });  
    51.         }  
    52.   
    53.         executors.shutdown();  
    54.         System.out.println("finished");   
    55.     }  
    56.     public static void main(String[] args) {  
    57.         testExecute();  
    58.     }  
    59. }  
  • 相关阅读:
    微信平台的开发与集成
    自定义控件定义样式
    Android万能分辨率适应法
    Openfire配置过程,以及与php交互注意事项。
    Android 最近的一些新的功能
    自定义Ratingbar 评分控件
    解决android有的手机拍照后上传图片被旋转的问题
    Fragment 嵌套使用 Activity has been destoryed
    实现图文混排方法 类似于网易那样的
    Android 自定义View及其在布局文件中的使用示例
  • 原文地址:https://www.cnblogs.com/exmyth/p/7236977.html
Copyright © 2020-2023  润新知