线程池自定义扩展,捕获异常位置(非常有用)

简介: 一、前言 留给自己的前言:这个线程池在运用中非常有用,能够捕获异常是非常重要的,否则在此期间很难发现你的异常在哪里提交了; 二 自己定义扩展线程池 1、首先构建一个基础的 执行线程 package jDKMulit;import java.

一、前言

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

二 自己定义扩展线程池

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<Runnable>());
        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<Runnable> 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<Runnable>());
        //错误堆栈中可以看到是在哪里提交的任务
        for (int i = 0; i < 5; i++) {
            pools.execute(new DviTask(100,i));
        }
    }
}


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

异常查看;不仅仅可以得到异常发生Runnable的时限内的信息,而且得到了我们任务在哪里提交(红字体);对于排除错误很重要
<span style="color:#ff0000;">java.lang.Exception: client stack trace</span>
	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.0
25.0
33.0
50.0






目录
相关文章
|
19天前
|
并行计算 Java 数据处理
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
99 0
|
23天前
线程CPU异常定位分析
【10月更文挑战第3天】 开发过程中会出现一些CPU异常升高的问题,想要定位到具体的位置就需要一系列的分析,记录一些分析手段。
46 0
|
21天前
|
Java 应用服务中间件
面对海量网络请求,Tomcat线程池如何进行扩展?
【10月更文挑战第4天】本文详细探讨了Tomcat线程池相较于标准Java实用工具包(JUC)线程池的关键改进。首先,Tomcat线程池在启动时即预先创建全部核心线程,以应对启动初期的高并发请求。其次,通过重写阻塞队列的入队逻辑,Tomcat能够在任务数超过当前线程数但未达最大线程数时,及时创建非核心线程,而非等到队列满才行动。此外,Tomcat还引入了在拒绝策略触发后重新尝试入队的机制,以提高吞吐量。这些优化使得Tomcat线程池更适应IO密集型任务,有效提升了性能。
面对海量网络请求,Tomcat线程池如何进行扩展?
|
10天前
|
监控 Java
在实际应用中选择线程异常捕获方法的考量
【10月更文挑战第15天】选择最适合的线程异常捕获方法需要综合考虑多种因素。没有一种方法是绝对最优的,需要根据具体情况进行权衡和选择。在实际应用中,还需要不断地实践和总结经验,以提高异常处理的效果和程序的稳定性。
17 3
|
10天前
|
监控 Java
捕获线程执行异常的多种方法
【10月更文挑战第15天】捕获线程执行异常的方法多种多样,每种方法都有其特点和适用场景。在实际开发中,需要根据具体情况选择合适的方法或结合多种方法来实现全面有效的线程异常捕获。这有助于提高程序的健壮性和稳定性,减少因线程异常带来的潜在风险。
10 1
|
10天前
|
监控 API
Hook 线程与捕获线程执行异常
【10月更文挑战第11天】Hook 线程和捕获线程执行异常是多线程编程中不可或缺的技术。通过深入理解和掌握这些方法,我们可以提高程序的稳定性和可靠性,更好地应对各种异常情况。同时,在实际应用中要注意平衡性能和准确性,制定合理的异常处理策略,以确保程序的正常运行。
22 1
|
2月前
|
消息中间件 前端开发 NoSQL
面试官:线程池遇到未处理的异常会崩溃吗?
面试官:线程池遇到未处理的异常会崩溃吗?
70 3
面试官:线程池遇到未处理的异常会崩溃吗?
|
2月前
|
监控 Java
线程池中线程异常后:销毁还是复用?技术深度剖析
在并发编程中,线程池作为一种高效利用系统资源的工具,被广泛用于处理大量并发任务。然而,当线程池中的线程在执行任务时遇到异常,如何妥善处理这些异常线程成为了一个值得深入探讨的话题。本文将围绕“线程池中线程异常后:销毁还是复用?”这一主题,分享一些实践经验和理论思考。
108 3
|
3月前
|
Java
线程池中线程抛了异常,该如何处理?
【8月更文挑战第27天】在Java多线程编程中,线程池(ThreadPool)是一种常用的并发处理工具,它能够有效地管理线程的生命周期,提高资源利用率,并简化并发编程的复杂性。然而,当线程池中的线程在执行任务时抛出异常,如果不妥善处理,这些异常可能会导致程序出现未预料的行为,甚至崩溃。因此,了解并掌握线程池异常处理机制至关重要。
360 0