博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程池自定义扩展,捕获异常位置(非常有用)
阅读量:6880 次
发布时间:2019-06-26

本文共 3584 字,大约阅读时间需要 11 分钟。

一、前言

留给自己的前言:这个线程池在运用中非常有用,能够捕获异常是非常重要的,否则在此期间很难发现你的异常在哪里提交了;

二 自己定义扩展线程池

1、首先构建一个基础的 执行线程

package jDKMulit;import java.util.concurrent.*;/** * Created by ycy on 16/1/12. */public class DviTask implements  Runnable{    int a,b;    public void run() {        double re=a/b;        System.out.println(re);    }    public DviTask(int a,int b){        this.a=a;        this.b=b;    }    public static void main(String[] args) throws ExecutionException, InterruptedException {        ThreadPoolExecutor pools= new ThreadPoolExecutor(0,Integer.MAX_VALUE,0l, TimeUnit.SECONDS,new SynchronousQueue
()); for (int i = 0; i <5 ; i++) { // pools.execute(new DviTask(100,i)); Future re= pools.submit(new DviTask(100,i)); re.get(); } }}

2、扩展我们的线程池

package jDKMulit;import java.util.concurrent.*;/** * Created by ycy on 16/1/13. * 自己扩展线程池获取异常位置 * 重写submit:可以拉取异常 */public class VeryTraceThreadPoolExecutor extends ThreadPoolExecutor {    // 初始化    public VeryTraceThreadPoolExecutor(int corePoolSize, int maxmumPoolSize,                                       long keepAliveTime, TimeUnit unit, BlockingQueue
workQueue){ super(corePoolSize,maxmumPoolSize,keepAliveTime,unit,workQueue); } //执行方法 @Override public void execute(Runnable command) { super.execute(command); } @Override public Future
submit(Runnable task) { return super.submit(wrap(task,clientTrace(),Thread.currentThread().getName())); } private Exception clientTrace(){ //扔出异常 return new Exception("client stack trace"); } private Runnable wrap(final Runnable task,final Exception clientStack,String clientThreadName){ return new Runnable() { public void run() { try { task.run(); } catch (Exception e) { clientStack.printStackTrace(); try { throw e; } catch (Exception e1) { e1.printStackTrace(); } } } }; } public static void main(String[] args) { ThreadPoolExecutor pools=new VeryTraceThreadPoolExecutor(0,Integer.MAX_VALUE,0l,TimeUnit.SECONDS,new SynchronousQueue
()); //错误堆栈中可以看到是在哪里提交的任务 for (int i = 0; i < 5; i++) { pools.execute(new DviTask(100,i)); } }}

3、执行结果查询异常位置

异常查看;不仅仅可以得到异常发生Runnable的时限内的信息,而且得到了我们任务在哪里提交(红字体);对于排除错误很重要
java.lang.Exception: client stack trace	at jDKMulit.VeryTraceThreadPoolExecutor.clientTrace(VeryTraceThreadPoolExecutor.java:31)	at jDKMulit.VeryTraceThreadPoolExecutor.execute(VeryTraceThreadPoolExecutor.java:21)	at jDKMulit.VeryTraceThreadPoolExecutor.main(VeryTraceThreadPoolExecutor.java:57)	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)	at java.lang.reflect.Method.invoke(Method.java:606)	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)java.lang.ArithmeticException: / by zero	at jDKMulit.DviTask.run(DviTask.java:12)	at jDKMulit.VeryTraceThreadPoolExecutor$1.run(VeryTraceThreadPoolExecutor.java:40)	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)	at java.lang.Thread.run(Thread.java:745)100.025.033.050.0

转载地址:http://xlgfl.baihongyu.com/

你可能感兴趣的文章
05_Node js 文件管理模块 fs
查看>>
关于python中可迭代对象和迭代器的一些理解
查看>>
界面无小事(五):自定义TextView
查看>>
ES6读书笔记(三)
查看>>
视频播放器全屏旋转方案
查看>>
根据调试工具看Vue源码之生命周期(一)
查看>>
RxJS教程
查看>>
在高并发环境下Reids做缓存踩坑记录
查看>>
通俗易懂--岭回归(L2)、lasso回归(L1)、ElasticNet讲解(算法+案例)
查看>>
Word类报表实例 - 质量检测报告
查看>>
Java进阶篇设计模式之二 ----- 工厂模式
查看>>
2018以太坊编程语言solidity最佳IDE
查看>>
hey,你的CommonJS规范
查看>>
定位?
查看>>
《工具癖》从Github下载开源电子书
查看>>
让Vue的v-for支持迭代器遍历
查看>>
微服务架构基础之API网关
查看>>
下载速度
查看>>
传统电视or互联网电视,智能电视领域谁才是虎狼之师
查看>>
Redis哨兵模式主从同步不可以绑定127.0.0.1或者0.0.0.0,不然无法进行主从同步
查看>>