`

java 线程池 异常 处理 机制 分析

 
阅读更多
public class ThreadTest {

    public static void main(String[] args) {
        ExecutorService exe = Executors.newFixedThreadPool(10);
        ExecutorCompletionService com  =  new ExecutorCompletionService(exe);
        Future future = com.submit(new Runnable(){
            @Override
            public void run() {
				throw new RuntimeException();
            }},"success");

        try{
            System.out.println(com.take().get());
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}


上述代码只有在调用get()时抛出异常,否则不打印任何异常信息,查看源码得到原因如下:

public Future<V> submit(Runnable task, V result) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<V> f = newTaskFor(task, result);
        executor.execute(new QueueingFuture(f));
        return f;
    }

ExecutorCompletionService 的submit方法将Runnable 包装为一个RunnableFuture,而RunnableFuture的实现类为FutureTask,FutureTask的run方法如下:
public void run() {
        sync.innerRun();
    }

void innerRun() {
            if (!compareAndSetState(READY, RUNNING))
                return;

            runner = Thread.currentThread();
            if (getState() == RUNNING) { // recheck after setting thread
                V result;
                try {
                    result = callable.call();
                } catch (Throwable ex) {
                    setException(ex);
                    return;
                }
                set(result);
            } else {
                releaseShared(0); // cancel
            }
        }

可以看出当程序抛出异常时,没有打印任何异常信息,只是调用setException(ex),将异常信息赋值给 exception变量。当调用future.get()方法时,抛出异常,代码如下:
V innerGet() throws InterruptedException, ExecutionException {
            acquireSharedInterruptibly(0);
            if (getState() == CANCELLED)
                throw new CancellationException();
            if (exception != null)
                throw new ExecutionException(exception);
            return result;
        }



分享到:
评论

相关推荐

    自定义实现Java线程池2-完善异常处理和去除同步1

    本文将讨论如何在自定义线程池中完善异常处理和去除同步,以提高效率和程序的健壮性。 首先,从提供的代码片段来看,线程池的核心部分是`execute`方法,它是线程池接收并分配任务的主要入口。在这个方法中,首先...

    java线程池封装j

    4. **异常处理**:添加适当的异常处理机制,比如捕获并记录`RejectedExecutionException`,以应对线程池拒绝执行任务的情况。 5. **关闭线程池**:提供`shutdown()`或`shutdownNow()`方法,用于优雅地关闭线程池。 ...

    JAVA使用线程池查询大批量数据

    在Java开发中,处理大批量数据时,合理利用线程池可以显著提高程序的执行效率和资源利用率。本文将深入探讨如何在Java中使用线程池来查询大量数据,以及这样做的好处和实现方法。 首先,理解线程池的概念至关重要。...

    Java 线程池框架核心代码分析1

    总结,Java线程池通过`ThreadPoolExecutor`提供了一种高效管理线程的机制,通过配置核心参数和选择合适的线程池模型,可以优化系统的资源利用和任务调度,提高系统性能。理解线程池的工作原理和核心代码对于编写高效...

    java 线程池实现多并发队列后进先出

    Java线程池是一种高效管理并发任务的机制,它允许开发者预先配置一定数量的线程,以便在处理多个并发任务时能有效地复用这些线程,从而避免了频繁创建和销毁线程带来的开销。在Java中,`java.util.concurrent`包下的...

    java 线程池

    ### Java线程池详解 ...Java线程池是一种高效、实用的多线程处理方案,它通过管理和复用一定数量的线程来避免频繁创建和销毁线程所带来的开销。正确配置和使用线程池对于提升程序的性能和稳定性具有重要意义。

    自定义实现Java线程池1-模拟jdk线程池执行流程1

    【自定义Java线程池实现】 在Java编程中,线程池是一种高效管理线程资源的方式,可以提高系统的性能和响应速度。本篇将探讨如何模拟Java的JDK线程池执行流程,以理解其设计原理。核心知识点包括线程池的执行策略、...

    基于Java线程池技术的数据爬虫设计与实现.zip

    3. 异常处理:线程池提供了异常处理机制,当某个线程因异常退出时,可以自动替换新线程继续工作,保证爬虫稳定运行。 4. 队列控制:根据工作队列的类型,合理设置队列容量,平衡爬取速度和内存占用。 四、优化策略 ...

    JAVA线程池应用.pptx

    ### JAVA线程池应用知识点详解 #### 一、Java线程池概述 线程池是Java多线程编程中的一个重要概念。它通过管理一组多线程的方式,为应用程序提供了一种更加灵活高效的线程管理机制。相比于直接创建线程,使用线程池...

    采用线程池机制下载文件

    4. **重试和异常处理**:线程池可以统一处理线程执行过程中的异常,比如网络中断。如果某个线程在下载过程中出现问题,线程池可以自动重启该线程,或者将任务重新分配给其他线程,保证下载的可靠性。 在`...

    Java线程池学习资料-全

    Java线程池是一种高效管理并发任务的工具,它通过复用线程来减少创建和销毁线程的开销,从而提高系统性能。线程池的核心组成部分包括工作队列(Work Queue)、工作线程(Worker Threads)和任务调度器(Executor)。...

    Java线程池,正式上线运行的源码,分享欢迎使用并提意见

    Java线程池的源码解析可以让我们更深入地理解其内部机制。`ThreadPoolExecutor`类中,`execute()`方法是提交任务的关键入口,它会根据线程池的状态和当前的工作情况决定如何处理任务。同时,`ThreadPoolExecutor`的...

    Java线程池用法实战案例分析

    Java线程池用法实战案例分析 Java线程池是Java并发编程中的一种重要机制,用于管理和执行多个线程,以提高程序的并发性和性能。在本文中,我们将通过实战案例来剖析Java线程池的用法,包括线程池的创建、使用和终止...

    java线程池工作队列饱和策略代码示例

    Java线程池工作队列饱和策略是Java并发编程中的一种重要机制,用于处理线程池中工作队列的饱和问题。在本文中,我们将详细介绍Java线程池工作队列饱和策略的概念、原理和实现。 线程池(Thread Pool)是并行执行...

    java线程池_2.pdf

    Java线程池是一种管理线程资源的技术,它通过限制系统中执行线程的数量来优化程序性能,避免因频繁创建和销毁线程导致的系统开销。线程池的核心原理是维护一个工作线程集合和一个任务队列。当任务到来时,如果线程池...

    Java线程池完整代码,已经用于实际的项目中,性能稳定.zip

    Java线程池是一种高效管理并发任务执行的机制,它通过维护一组可重用的线程,减少了创建和销毁线程的开销。本压缩包包含的`ThreadPool.java`、`PooledThread.java`和`ThreadTask.java`是实现线程池功能的核心组件。 ...

    java后端面试题,涵盖:java基础、jvm、Redis、mybatis、mysql、springMVC、java线程池等

    7. **Java线程池**:Java的并发处理能力主要通过线程池实现,如Executors框架中的ThreadPoolExecutor。面试中会关注线程池的工作原理、线程池的参数设置(corePoolSize、maximumPoolSize、keepAliveTime等)、线程池...

    java多线程中的异常处理机制简析

    Java多线程异常处理机制是Java并发编程中不可或缺的一部分,主要关注如何管理和处理在多线程环境下出现的异常。在Java中,异常分为两大类:Checked异常和Unchecked异常。Checked异常是那些在编译期间必须处理的异常...

Global site tag (gtag.js) - Google Analytics