`
jamie.wang
  • 浏览: 344985 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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,例如:

import java.lang.Thread.UncaughtExceptionHandler;
import java.util.Random;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

public class ExecutorServiceDemo {

    public static void testExecute() {
        ExecutorService executors = new ThreadPoolExecutor(10, 20, 60, TimeUnit.SECONDS,
                new LinkedBlockingQueue<Runnable>(), new ThreadFactory() {
                    final AtomicInteger threadNumber = new AtomicInteger(1);

                    public Thread newThread(Runnable r) {
                        Thread t = new Thread(Thread.currentThread().getThreadGroup(), r, "topPatternTasklet-thread"
                                + (threadNumber.getAndIncrement()));
                        t.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {

                            public void uncaughtException(Thread t, Throwable e) {
                                System.out.println(e);
                            }
                            
                        });
                        return t;
                    }
                }, new ThreadPoolExecutor.CallerRunsPolicy());

        final Random r = new Random();
        for (int i = 0; i < 10; ++i) {
            executors.execute(new Runnable() {

                public void run() {
                    try {
                        int ri = r.nextInt(1000);
                        Thread.sleep(ri);
                        if (ri % 3 == 0) {
                            System.out.println("ri:" + ri);
                            throw new RuntimeException("haha error!");
                        }
                        System.out.println(Thread.currentThread());
                    } catch (InterruptedException e) {
                    }
                }
            });
        }

        executors.shutdown();
        System.out.println("finished"); 
    }
    public static void main(String[] args) {
        testExecute();
    }
}

 

分享到:
评论

相关推荐

    Java 实例 - 多线程异常处理源代码-详细教程.zip

    2. **自定义异常处理**:通过实现`Thread.UncaughtExceptionHandler`接口并将其设置为线程的处理器,可以自定义线程异常的处理方式。例如: ```java thread.setDefaultUncaughtExceptionHandler(new Thread....

    WHUT-java多线程实验-第二周-异常处理.zip

    本实验主要关注的是Java多线程中的异常处理,这在保证程序稳定性和可靠性方面至关重要。 异常处理是Java编程中不可或缺的一部分,它允许程序员优雅地处理程序运行时可能出现的问题,而不是让程序突然崩溃。Java通过...

    redis lits queue 和 ThreadPoolExecutor 结合

    线程池可以控制并发级别,避免频繁地创建和销毁线程带来的开销,同时还能进行任务调度和异常处理。 3. **结合使用**:将Redis List作为任务队列,ThreadPoolExecutor负责任务的执行。当新的任务被添加到Redis List...

    JDK之ThreadPoolExecutor源码分析1

    4. `beforeExecute()`和`afterExecute()`,在任务执行前后调用,可以用于自定义监控和异常处理。 理解这些核心组件的工作方式,有助于我们在实际开发中更有效地使用线程池,优化系统的并发性能,并避免资源浪费。在...

    说说你对ThreadPoolExecutor的理解.docx

    异常处理方面,如果在执行线程任务时出现错误,会调用processWorkerExit进行处理。如果线程池不是RUNNING状态,SHUTDOWN状态下会尝试完成工作队列中的任务,而STOP状态下则不会接受新任务并中断所有正在执行的任务。...

    Python线程池模块ThreadPoolExecutor用法分析

    通过`ThreadPoolExecutor`,Python程序员可以轻松地实现多线程并行处理,提高程序性能。这个模块特别适用于执行大量独立、无依赖的任务,例如网络请求、文件处理或计算密集型任务。了解并熟练使用`...

    使用线程池ThreadPoolExecutor 抓取论坛帖子列表

    4. 当线程数达到最大值且任务队列已满,新提交的任务会被拒绝,此时可以设置一个`RejectedExecutionHandler`来处理这种情况,例如丢弃任务或抛出异常。 在实际应用中,我们可能还需要关注线程池的监控和调优,例如...

    java线程异常

    在Java中,线程的使用涉及到一系列的关键概念和技术,包括线程的创建、同步、调度以及异常处理。 首先,Java通过`Thread`类和`Runnable`接口提供了线程的实现方式。创建一个线程可以通过直接继承`Thread`类并重写其...

    ThreadPoolExecutor线程池的使用方法

    在ThreadPoolExecutor中,还有拒绝策略的概念,当线程池中的线程数大于maximumPoolSize时,线程池就不能在处理任何任务了,这时线程池会抛出异常。拒绝策略有四种:AbortPolicy、CallerRunsPolicy、...

    05_ExceptionAndThread_java线程和异常方法_

    在Java编程语言中,线程和异常处理是两个至关重要的概念,它们对于任何开发者来说都是必须掌握的基础知识。本文将深入探讨"05_ExceptionAndThread_java线程和异常方法_"这个主题,帮助你巩固和深化对这两个核心概念...

    线程池ThreadPoolExecutor

    4. `AbortPolicy`:默认策略,抛出`RejectedExecutionException`异常。 在实际编程中,我们可以根据业务需求调整这些参数,以实现最优的线程池配置,确保系统的高并发处理能力和资源利用率。通过合理使用线程池,...

    java 中ThreadPoolExecutor原理分析

    * handler:线程池中的异常处理器,用于处理线程池中的异常情况。 ThreadPoolExecutor 的工作流程可以分为以下几个步骤: 1. 任务提交:用户提交一个任务到线程池中。 2. 任务队列:任务被添加到线程池中的任务...

    11-线程池ThreadPoolExecutor底层原理源码分析(上)-周瑜.pdf

    根据提供的文件信息,我们可以深入探讨线程池`ThreadPoolExecutor`的工作原理及其实现细节,同时也会涉及并发编程中的一些关键概念和技术。 ### 线程池`ThreadPoolExecutor`概述 `ThreadPoolExecutor`是Java中非常...

    java中ThreadPoolExecutor常识汇总

    ThreadPoolExecutor 是 Java 中的一种线程池实现,用于管理线程池中的线程,提高系统的并发处理能力。在 Java 中,线程池技术广泛应用于并发编程中,通过调用 ThreadPoolExecutor 来实现线程池的管理。 ...

    JAVA基础

    本资源主要涵盖了Java的基础知识,包括但不限于集合类和并发包的使用,以及异常处理的最佳实践。通过深入理解这些内容,开发者可以更好地掌握Java编程的核心技能。 【详细知识点】: 1. **Java集合框架**: - **...

    通过代码实例了解Python异常本质

    在多线程环境中,如使用`ThreadPoolExecutor`,异常处理变得更加复杂,需要确保每个线程的任务都能正确地捕获和处理异常,防止线程池的其他任务受到影响。 总的来说,理解和熟练掌握Python的异常处理机制是编写健壮...

    Socket通讯解决并发采用线程池

    3. 异常处理:线程池可以配置异常处理策略,如当线程发生异常时,可以选择重新启动线程或关闭线程池。 总结起来,通过使用线程池优化Socket并发通信,我们可以更好地管理资源,提高系统性能,同时保持程序的稳定性...

Global site tag (gtag.js) - Google Analytics