zoukankan      html  css  js  c++  java
  • 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. }  
  • 相关阅读:
    日常小算法
    美化type="file"控件
    流文件_从网络中获取文件
    Kibana配置安装
    JDK安装
    Node.js安装windows环境
    RabbitMQ高可用
    RabbitMQ实例C#
    RabbitMQ基础命令rabbitmqctl
    RabbitMQ配置
  • 原文地址:https://www.cnblogs.com/exmyth/p/7236977.html
Copyright © 2011-2022 走看看