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(); } }
相关推荐
2. **自定义异常处理**:通过实现`Thread.UncaughtExceptionHandler`接口并将其设置为线程的处理器,可以自定义线程异常的处理方式。例如: ```java thread.setDefaultUncaughtExceptionHandler(new Thread....
本实验主要关注的是Java多线程中的异常处理,这在保证程序稳定性和可靠性方面至关重要。 异常处理是Java编程中不可或缺的一部分,它允许程序员优雅地处理程序运行时可能出现的问题,而不是让程序突然崩溃。Java通过...
线程池可以控制并发级别,避免频繁地创建和销毁线程带来的开销,同时还能进行任务调度和异常处理。 3. **结合使用**:将Redis List作为任务队列,ThreadPoolExecutor负责任务的执行。当新的任务被添加到Redis List...
在ThreadPoolExecutor中,还有拒绝策略的概念,当线程池中的线程数大于maximumPoolSize时,线程池就不能在处理任何任务了,这时线程池会抛出异常。拒绝策略有四种:AbortPolicy、CallerRunsPolicy、...
4. `beforeExecute()`和`afterExecute()`,在任务执行前后调用,可以用于自定义监控和异常处理。 理解这些核心组件的工作方式,有助于我们在实际开发中更有效地使用线程池,优化系统的并发性能,并避免资源浪费。在...
异常处理方面,如果在执行线程任务时出现错误,会调用processWorkerExit进行处理。如果线程池不是RUNNING状态,SHUTDOWN状态下会尝试完成工作队列中的任务,而STOP状态下则不会接受新任务并中断所有正在执行的任务。...
通过`ThreadPoolExecutor`,Python程序员可以轻松地实现多线程并行处理,提高程序性能。这个模块特别适用于执行大量独立、无依赖的任务,例如网络请求、文件处理或计算密集型任务。了解并熟练使用`...
4. 当线程数达到最大值且任务队列已满,新提交的任务会被拒绝,此时可以设置一个`RejectedExecutionHandler`来处理这种情况,例如丢弃任务或抛出异常。 在实际应用中,我们可能还需要关注线程池的监控和调优,例如...
在Java中,线程的使用涉及到一系列的关键概念和技术,包括线程的创建、同步、调度以及异常处理。 首先,Java通过`Thread`类和`Runnable`接口提供了线程的实现方式。创建一个线程可以通过直接继承`Thread`类并重写其...
在Java编程语言中,线程和异常处理是两个至关重要的概念,它们对于任何开发者来说都是必须掌握的基础知识。本文将深入探讨"05_ExceptionAndThread_java线程和异常方法_"这个主题,帮助你巩固和深化对这两个核心概念...
4. `AbortPolicy`:默认策略,抛出`RejectedExecutionException`异常。 在实际编程中,我们可以根据业务需求调整这些参数,以实现最优的线程池配置,确保系统的高并发处理能力和资源利用率。通过合理使用线程池,...
* handler:线程池中的异常处理器,用于处理线程池中的异常情况。 ThreadPoolExecutor 的工作流程可以分为以下几个步骤: 1. 任务提交:用户提交一个任务到线程池中。 2. 任务队列:任务被添加到线程池中的任务...
根据提供的文件信息,我们可以深入探讨线程池`ThreadPoolExecutor`的工作原理及其实现细节,同时也会涉及并发编程中的一些关键概念和技术。 ### 线程池`ThreadPoolExecutor`概述 `ThreadPoolExecutor`是Java中非常...
ThreadPoolExecutor 是 Java 中的一种线程池实现,用于管理线程池中的线程,提高系统的并发处理能力。在 Java 中,线程池技术广泛应用于并发编程中,通过调用 ThreadPoolExecutor 来实现线程池的管理。 ...
本资源主要涵盖了Java的基础知识,包括但不限于集合类和并发包的使用,以及异常处理的最佳实践。通过深入理解这些内容,开发者可以更好地掌握Java编程的核心技能。 【详细知识点】: 1. **Java集合框架**: - **...
在多线程环境中,如使用`ThreadPoolExecutor`,异常处理变得更加复杂,需要确保每个线程的任务都能正确地捕获和处理异常,防止线程池的其他任务受到影响。 总的来说,理解和熟练掌握Python的异常处理机制是编写健壮...
3. 异常处理:线程池可以配置异常处理策略,如当线程发生异常时,可以选择重新启动线程或关闭线程池。 总结起来,通过使用线程池优化Socket并发通信,我们可以更好地管理资源,提高系统性能,同时保持程序的稳定性...
其他说明:多线程并发: 通过 concurrent.futures.ThreadPoolExecutor() 实现多线程并发处理,提高了文件处理的效率,特别适用于大型文件。可定制性: 用户可以根据需要定制关键词、上下文行数等参数