`

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多线程中的异常处理机制简析

    在java多线程程序中,所有线程都不允许抛出未捕获的checked exception,也就是说各个线程需要自己把自己的checked exception处理掉,需要了解的朋友可以参考下

    某大学往年期末考试题:Java考试(含答案).docx

    熟悉Java的异常处理机制,了解如何捕捉和处理异常。 了解Java的集合框架和泛型,包括List、Set、Map等常见集合类型。 掌握Java的文件读写操作,包括读写文件、处理文件路径等。 熟悉Java的多线程编程,包括创建线程...

    java最新高薪面试题库.docx

    Java中的锁机制有哪些?它们有什么区别? 什么是线程安全?在Java中如何实现线程安全? 什么是继承?Java中的继承有哪些特点? 什么是多态?Java中的多态有哪些实现方式? 什么是抽象类?Java中的抽象类有哪些特点?...

    java面试常用知识点.docx

    Java基础:变量、数据类型、运算符、条件语句、循环语句、数组、集合、异常处理等 面向对象:类、继承、多态、包、接口、抽象类、泛型等 异常处理:try-catch-finally、异常分类及处理、自定义异常等 线程:线程创建...

    java高手真经 光盘源码

    javaexception.zip 07.Java面向对象编程扩展(计算器异常捕捉实例) 第3部分(5个程序包) javaio.zip 09.Java输入/输出流 javavi.zip 09.Java输入/输出流上机作业参考(文本编辑器) javathread.zip 10.Java多...

    Java后端面试问题整理.docx

    • 熟悉常见异常分类以及处理,熟悉反射、注解、内部类、泛型、序列化、深浅复制 • 熟悉Java多线程并发中线程基本方法,线程池,线程生命周期,熟悉Java锁中常见锁分类(乐观/悲观锁、自旋锁、独/共享锁、可重入锁、...

    Java高手真经(编程基础卷)光盘全部源码 免积分

    javaexception.zip 07.Java面向对象编程扩展(计算器异常捕捉实例) 第3部分(5个程序包) javaio.zip 09.Java输入/输出流 javavi.zip 09.Java输入/输出流上机作业参考(文本编辑器) javathread.zip 10.Java多...

    Java面试技术面知识扩展包第一弹

    5. 异常处理:面试官可能会询问您关于Java异常处理的知识,包括异常的分类、try-catch-finally块的使用、自定义异常类等。 6. 输入输出(IO):面试官可能会问及Java IO的知识,如字节流和字符流的区别、文件读写、...

    Java面试问题带答案40道.docx

    答:异常处理是指在程序执行过程中遇到错误时进行处理的机制。Java中使用try-catch语句来捕获异常并进行处理。 7. 什么是Java中的泛型? 答:泛型是Java中一种参数化类型的概念,允许在编译时期检查类

    北京百度java面试题大全

    异常处理:包括异常的分类、try-catch-finally块的使用、自定义异常等异常处理的相关内容。 多线程编程:涉及线程的创建、同步与互斥、线程池、线程间通信等多线程编程的知识。 IO操作:包括文件读写、字符流和...

    Java高手真经(编程基础卷)光盘全部源码

    javaexception.zip 07.Java面向对象编程扩展(计算器异常捕捉实例) 第3部分(5个程序包) javaio.zip 09.Java输入/输出流 javavi.zip 09.Java输入/输出流上机作业参考(文本编辑器) javathread.zip 10.Java多线程...

    疯狂JAVA讲义

    10.2 异常处理机制 358 10.2.1 使用try...catch捕获异常 359 10.2.2 异常类的继承体系 360 10.2.3 访问异常信息 363 10.2.4 使用finally回收资源 364 10.2.5 异常处理的嵌套 367 10.3 Checked异常和Runtime...

    Java多线程与线程安全实践-基于Http协议的断点续传的实现.rar

    异常处理:在实现过程中需要考虑各种异常情况,如网络连接异常、文件IO异常等,需要进行适当的异常处理和错误提示,保证程序的稳定性和可靠性。 通过以上实践,可以实现基于HTTP协议的断点续传功能,提供更快速、...

    Java 7并发编程实战手册

    《Java 7并发编程实战手册》是Java 7并发编程的实战指南,介绍了Java 7并发API中大部分重要而有用的机制。全书分为9章,涵盖了线程管理、线程同步、线程执行器、Fork/Join框架、并发集合、定制并发类、测试并发应用...

    java内部学习笔记.docx

    5.1 Java异常处理机制 49 5.2 File文件类 51 5.3 RandomAccessFile类 53 5.4基本流:FIS和FOS 55 5.5缓冲字节高级流:BIS和BOS 56 5.6基本数据类型高级流:DIS和DOS 56 5.7字符高级流:ISR和OSW 57 5.8缓冲字符高级...

    【并发编程】自定义简单线程池.pdf

    错误处理:讲解并发编程中的错误处理,如异常安全、错误传播等。 实际案例:通过实际的编程案例来展示并发编程的应用。 适合的人群 初学者:对计算机科学或编程有一定了解,但尚未接触过并发编程的开发者。 中级...

Global site tag (gtag.js) - Google Analytics