- 浏览: 139518 次
- 性别:
- 来自: 北京
文章分类
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; }
发表评论
-
storm 安装
2013-09-02 16:32 3066------------------------------- ... -
动态代理性能比较
2013-01-18 17:02 1155转自http://javatar.iteye.com/blog ... -
java 类加载器学习
2012-12-14 10:47 1032引用1.自定义类加载器 public interface ... -
jackson 学习
2012-11-13 15:42 10021.json 转为object对象 public clas ... -
ThreadPoolExecutor 原理-- java 线程池
2012-08-08 19:14 1143整个ThreadPoolExecutor的任务处理有4 ... -
java 缓冲
2012-08-08 19:12 1062import org.apache.log4j.Logge ... -
java 程序消耗 cpu 100% 查找方法
2012-05-16 14:38 17216问题原因:由于HashMap是非线程安全的,在多线程访问时,造 ... -
java io
2012-04-24 11:06 9151、按字节读取文件内容 2、按字符读取文件内容 3、按行读取 ... -
java 内省
2011-11-20 22:58 835java内省 -
系统常用工具类
2011-04-20 17:46 10331.ArithUtil.java ... -
spring 面向切面编程
2010-12-27 17:03 1088@Aspect public class AspectCoup ... -
jxl 写入excel
2010-11-10 13:52 10121.程序调用 ReportInterface report ... -
java 读取excel
2010-11-10 09:04 954package com.longtuo.client.act ... -
java 生成略缩图
2010-10-20 17:21 1201import java.awt.Graphics2D; imp ... -
XStream简单介绍
2010-09-10 15:44 1684创建能够序列化的类 这是一组简单的类。XStream能把这 ... -
java中对集合类的排序
2010-05-04 13:47 9021.第一种 public class User impleme ... -
Java 获取操作系统信息与Desktop类
2009-11-17 16:24 1364import java.util.Properties; ... -
java 事物处理
2009-10-15 10:52 1432public boolean deleteSchedule ...
相关推荐
本文将讨论如何在自定义线程池中完善异常处理和去除同步,以提高效率和程序的健壮性。 首先,从提供的代码片段来看,线程池的核心部分是`execute`方法,它是线程池接收并分配任务的主要入口。在这个方法中,首先...
4. **异常处理**:添加适当的异常处理机制,比如捕获并记录`RejectedExecutionException`,以应对线程池拒绝执行任务的情况。 5. **关闭线程池**:提供`shutdown()`或`shutdownNow()`方法,用于优雅地关闭线程池。 ...
在Java开发中,处理大批量数据时,合理利用线程池可以显著提高程序的执行效率和资源利用率。本文将深入探讨如何在Java中使用线程池来查询大量数据,以及这样做的好处和实现方法。 首先,理解线程池的概念至关重要。...
总结,Java线程池通过`ThreadPoolExecutor`提供了一种高效管理线程的机制,通过配置核心参数和选择合适的线程池模型,可以优化系统的资源利用和任务调度,提高系统性能。理解线程池的工作原理和核心代码对于编写高效...
Java线程池是一种高效管理并发任务的机制,它允许开发者预先配置一定数量的线程,以便在处理多个并发任务时能有效地复用这些线程,从而避免了频繁创建和销毁线程带来的开销。在Java中,`java.util.concurrent`包下的...
### Java线程池详解 ...Java线程池是一种高效、实用的多线程处理方案,它通过管理和复用一定数量的线程来避免频繁创建和销毁线程所带来的开销。正确配置和使用线程池对于提升程序的性能和稳定性具有重要意义。
【自定义Java线程池实现】 在Java编程中,线程池是一种高效管理线程资源的方式,可以提高系统的性能和响应速度。本篇将探讨如何模拟Java的JDK线程池执行流程,以理解其设计原理。核心知识点包括线程池的执行策略、...
3. 异常处理:线程池提供了异常处理机制,当某个线程因异常退出时,可以自动替换新线程继续工作,保证爬虫稳定运行。 4. 队列控制:根据工作队列的类型,合理设置队列容量,平衡爬取速度和内存占用。 四、优化策略 ...
### JAVA线程池应用知识点详解 #### 一、Java线程池概述 线程池是Java多线程编程中的一个重要概念。它通过管理一组多线程的方式,为应用程序提供了一种更加灵活高效的线程管理机制。相比于直接创建线程,使用线程池...
4. **重试和异常处理**:线程池可以统一处理线程执行过程中的异常,比如网络中断。如果某个线程在下载过程中出现问题,线程池可以自动重启该线程,或者将任务重新分配给其他线程,保证下载的可靠性。 在`...
Java线程池是一种高效管理并发任务的工具,它通过复用线程来减少创建和销毁线程的开销,从而提高系统性能。线程池的核心组成部分包括工作队列(Work Queue)、工作线程(Worker Threads)和任务调度器(Executor)。...
Java线程池的源码解析可以让我们更深入地理解其内部机制。`ThreadPoolExecutor`类中,`execute()`方法是提交任务的关键入口,它会根据线程池的状态和当前的工作情况决定如何处理任务。同时,`ThreadPoolExecutor`的...
Java线程池用法实战案例分析 Java线程池是Java并发编程中的一种重要机制,用于管理和执行多个线程,以提高程序的并发性和性能。在本文中,我们将通过实战案例来剖析Java线程池的用法,包括线程池的创建、使用和终止...
Java线程池工作队列饱和策略是Java并发编程中的一种重要机制,用于处理线程池中工作队列的饱和问题。在本文中,我们将详细介绍Java线程池工作队列饱和策略的概念、原理和实现。 线程池(Thread Pool)是并行执行...
Java线程池是一种管理线程资源的技术,它通过限制系统中执行线程的数量来优化程序性能,避免因频繁创建和销毁线程导致的系统开销。线程池的核心原理是维护一个工作线程集合和一个任务队列。当任务到来时,如果线程池...
Java线程池是一种高效管理并发任务执行的机制,它通过维护一组可重用的线程,减少了创建和销毁线程的开销。本压缩包包含的`ThreadPool.java`、`PooledThread.java`和`ThreadTask.java`是实现线程池功能的核心组件。 ...
7. **Java线程池**:Java的并发处理能力主要通过线程池实现,如Executors框架中的ThreadPoolExecutor。面试中会关注线程池的工作原理、线程池的参数设置(corePoolSize、maximumPoolSize、keepAliveTime等)、线程池...
Java多线程异常处理机制是Java并发编程中不可或缺的一部分,主要关注如何管理和处理在多线程环境下出现的异常。在Java中,异常分为两大类:Checked异常和Unchecked异常。Checked异常是那些在编译期间必须处理的异常...