- 浏览: 53088 次
文章分类
最新评论
1. 构造函数
它最终调用另外一个构造函数
构造函数主要完成一些初始化的工作,如工作线程数目,保持有效时间,等待队列等。
2.execute()方法分析
在代码注解中说明很清楚,它有两个重要的操作:加入队列或者拒绝。
3.工作线程
工作线程(Worker)主要是来执行用户任务的,它的run方法如下:
再看看runWorker的实现。
有几点注意:
1. beforeExecute(wt, task),afterExecute(task, thrown);是没有实现的,用户可以扩展;
2. task.run(),这里不是start()方法。
4.一道被无数面试官问的问题:shutdown()
线程池shutdown()方法,并不是马上关闭。看看JDK官方文档是如何描述的。
它不会再接受新的线程加入,否则会抛出regjectException。但是它不会马上退出,直到之前
加入的线程执行完成之后才会退出。
另外一个方法shutdownNow()也不能马上关闭线程池,也还是看看JDK官方的描述吧。
看到Attempts没,只是尽力,并不保证。它与shutdown()的区别是,它有返回值,并且它们设置的状态不一样,一个是SHUTDOWN,另一个是STOP。
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler); }
它最终调用另外一个构造函数
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { if (corePoolSize < 0 || maximumPoolSize <= 0 || maximumPoolSize < corePoolSize || keepAliveTime < 0) throw new IllegalArgumentException(); if (workQueue == null || threadFactory == null || handler == null) throw new NullPointerException(); this.corePoolSize = corePoolSize; this.maximumPoolSize = maximumPoolSize; this.workQueue = workQueue; this.keepAliveTime = unit.toNanos(keepAliveTime); this.threadFactory = threadFactory; this.handler = handler; }
构造函数主要完成一些初始化的工作,如工作线程数目,保持有效时间,等待队列等。
2.execute()方法分析
public void execute(Runnable command) { if (command == null) throw new NullPointerException(); /* * Proceed in 3 steps: * * 1. If fewer than corePoolSize threads are running, try to * start a new thread with the given command as its first * task. The call to addWorker atomically checks runState and * workerCount, and so prevents false alarms that would add * threads when it shouldn't, by returning false. * * 2. If a task can be successfully queued, then we still need * to double-check whether we should have added a thread * (because existing ones died since last checking) or that * the pool shut down since entry into this method. So we * recheck state and if necessary roll back the enqueuing if * stopped, or start a new thread if there are none. * * 3. If we cannot queue task, then we try to add a new * thread. If it fails, we know we are shut down or saturated * and so reject the task. */ int c = ctl.get(); if (workerCountOf(c) < corePoolSize) { if (addWorker(command, true)) return; c = ctl.get(); } if (isRunning(c) && workQueue.offer(command)) { int recheck = ctl.get(); if (! isRunning(recheck) && remove(command)) reject(command); else if (workerCountOf(recheck) == 0) addWorker(null, false); } else if (!addWorker(command, false)) reject(command); }
在代码注解中说明很清楚,它有两个重要的操作:加入队列或者拒绝。
3.工作线程
工作线程(Worker)主要是来执行用户任务的,它的run方法如下:
/** Delegates main run loop to outer runWorker */ public void run() { runWorker(this); }
再看看runWorker的实现。
final void runWorker(Worker w) { Thread wt = Thread.currentThread(); Runnable task = w.firstTask; w.firstTask = null; w.unlock(); // allow interrupts boolean completedAbruptly = true; try { while (task != null || (task = getTask()) != null) { w.lock(); // If pool is stopping, ensure thread is interrupted; // if not, ensure thread is not interrupted. This // requires a recheck in second case to deal with // shutdownNow race while clearing interrupt if ((runStateAtLeast(ctl.get(), STOP) || (Thread.interrupted() && runStateAtLeast(ctl.get(), STOP))) && !wt.isInterrupted()) wt.interrupt(); try { beforeExecute(wt, task); Throwable thrown = null; try { task.run(); } catch (RuntimeException x) { thrown = x; throw x; } catch (Error x) { thrown = x; throw x; } catch (Throwable x) { thrown = x; throw new Error(x); } finally { afterExecute(task, thrown); } } finally { task = null; w.completedTasks++; w.unlock(); } } completedAbruptly = false; } finally { processWorkerExit(w, completedAbruptly); } }
有几点注意:
1. beforeExecute(wt, task),afterExecute(task, thrown);是没有实现的,用户可以扩展;
2. task.run(),这里不是start()方法。
4.一道被无数面试官问的问题:shutdown()
线程池shutdown()方法,并不是马上关闭。看看JDK官方文档是如何描述的。
/** * Initiates an orderly shutdown in which previously submitted * tasks are executed, but no new tasks will be accepted. */
它不会再接受新的线程加入,否则会抛出regjectException。但是它不会马上退出,直到之前
加入的线程执行完成之后才会退出。
另外一个方法shutdownNow()也不能马上关闭线程池,也还是看看JDK官方的描述吧。
/** * Attempts to stop all actively executing tasks, halts the * processing of waiting tasks, and returns a list of the tasks * that were awaiting execution. These tasks are drained (removed) * from the task queue upon return from this method. */
看到Attempts没,只是尽力,并不保证。它与shutdown()的区别是,它有返回值,并且它们设置的状态不一样,一个是SHUTDOWN,另一个是STOP。
发表评论
-
Java IO 读文件的各种方法总结
2016-01-01 15:00 697IO分为字节流和字符流,字符就是简单的字符串存储,从理伦上讲, ... -
动态代理的应用
2015-12-22 17:30 733代理模式作为开发人员 ... -
RPC 框架的设计思路
2015-12-19 15:11 634看过Hessian的部分源码,这里总结一点RPC的设计思路。 ... -
Java Restful
2015-12-19 14:01 440对于两个系统之间交互信息,有两种常见的方式:webservic ... -
request.getInputStream() 只能读一次的解决方法
2015-12-17 12:17 2379我们知道request.getInputStream()只能读 ... -
Tomcat7 编译并导入ecplise中运行
2015-12-17 09:10 478网上有很多这方面的文章,但大多数好像不太靠谱,至少按照上面的方 ... -
JAVA并发框架ReentrantLock与Condition
2015-12-14 22:50 497同步代码与同步代码块可以实现多线程的同步,JAVA并发框架提供 ... -
java Hessian 版本冲突问题解决方法
2015-12-11 19:44 883今天在实际的项目发现了一个问题就是hessian的版本不兼容的 ... -
ThreadPoolExecutor参数讲解
2015-12-10 08:14 8181. 线程池可以节省创建多个线程带来的开销问题。 2. 线程 ... -
Java RSA 加密 解密 签名 验签
2015-12-09 10:01 61511. 加密的作用 1)明文变密文(你不知道密钥是很难解密的) ... -
Java Xstream xml 与bean之间的转换
2015-12-09 08:31 747xml文件如下: <mvc> & ... -
XPATH 解析XML
2015-12-09 08:28 4351. 表达式描述 nodename 选取此节点的所有子节 ... -
Java Dom4j 解析XML
2015-12-09 08:23 366Dom4j和JDom是很相似的,用起来十分方便。 XML文件 ... -
Java JDom 解析xml
2015-12-09 08:22 419JDOM在解析XML在代码量之上比之前的方法(DOM和SAX要 ... -
Java SAX 解析xml
2015-12-08 18:13 422在上一篇中http://gaofulai1988.iteye. ... -
Java XML解析系列
2015-12-08 18:00 763Java解析XML有多种方式,因此需要分为几个不同的系列来讲。 ... -
Java 背包算法计算从数组中找若干个数使其最接近某个数
2015-12-08 17:38 1989背包的算法的动态方式如下: f(i,w) = max{ f(i ... -
Java 非线程安全的集合转线程安全
2015-12-08 08:30 646我们知道List, Set, HashMap都是非线程安全的, ... -
JDK Arrays sort
2015-12-07 21:12 4541. List排序的调用 Collections.sor ... -
HashSet 源码解读
2015-12-07 20:48 3421. HashSet底层是怎样实现的呢? 是HashMa ...
相关推荐
《JDK之ThreadPoolExecutor源码分析1》 在Java编程中,线程池是一种高效的管理线程的方式,它通过复用已存在的线程来避免频繁创建和销毁线程带来的开销。ThreadPoolExecutor作为Java中的线程池实现,其内部机制相当...
ThreadPoolExecutor源码解析.md
线程池ThreadPoolExecutor底层原理源码分析
### 线程池 `ThreadPoolExecutor` 原理源码分析 #### 一、概述 线程池作为 Java 并发编程中的重要组件,在实际应用中被广泛使用。其核心类 `ThreadPoolExecutor` 实现了对线程的管理、调度等功能。本文将围绕 `...
### 二、线程池的五种状态变换源码分析 线程池状态的变化主要由以下几个状态表示: - **RUNNING**:线程池接受新的任务并将队列中的任务提交给worker线程。 - **SHUTDOWN**:不再接受新任务,但继续处理队列中的...
线程池ThreadPoolExecutor的源码分析,含中文注释,深入了解线程池的构造
根据提供的文件信息,我们可以深入探讨线程池`ThreadPoolExecutor`的工作原理及其实现细节,同时也会涉及并发编程中的一些关键概念和技术。 ### 线程池`ThreadPoolExecutor`概述 `ThreadPoolExecutor`是Java中非常...
《JUC并发编程与源码分析视频课》是一门深入探讨Java并发编程的课程,主要聚焦于Java Util Concurrency(JUC)库的使用和源码解析。JUC是Java平台提供的一组高级并发工具包,它极大地简化了多线程编程,并提供了更...
于是乎到现在的Hibernate、MyBatis、Spring、Spring MVC、AQS、ThreadPoolExecutor、CountDownLatch使用场景和核心源码分析。 感觉自己还是真的菜鸡,有太多框架的底层实现都不怎么了解。 当山头被一座一座攻克时,...
JDK1.8源码分析 相关的原始码分析结果会以注解的形式体现到原始码中 已完成部分: ReentrantLock CountDownLatch Semaphore HashMap TreeMap LinkedHashMap ConcurrentHashMap 执行器 ...
这个压缩包"Android 上百实例源码分析以及开源分析 集合打包下"提供了丰富的资源,旨在帮助开发者们通过实例学习和剖析Android应用的实现细节。下面将详细讨论这个资源包中的主要知识点。 1. **Android基础知识**:...
"java并发源码分析之实战编程"这个主题深入探讨了Java平台上的并发处理机制,旨在帮助开发者理解并有效地利用这些机制来提高程序性能和可扩展性。在这个专题中,我们将围绕Java并发库、线程管理、锁机制、并发容器...
本文将深入探讨Java线程池的源码分析,并对比不同类型的线程池,以帮助开发者更好地理解和利用这一强大的工具。 首先,我们要理解Java线程池的核心类`java.util.concurrent.ThreadPoolExecutor`,它是所有自定义...
11-线程池 ThreadPoolExecutor 底层原理源码分析(上)-周瑜.pdf 12-线程池 ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf 13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、...
11-线程池 ThreadPoolExecutor 底层原理源码分析(上)-周瑜.pdf 12-线程池 ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf 13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、...
11-线程池 ThreadPoolExecutor 底层原理源码分析(上)-周瑜.pdf 12-线程池 ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf 13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、...
11-线程池 ThreadPoolExecutor 底层原理源码分析(上)-周瑜.pdf 12-线程池 ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf 13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、...
本文将详细讲解如何使用Java中的`ThreadPoolExecutor`来抓取论坛帖子列表,结合源码分析和实用工具的应用。 首先,我们要了解线程池的基本原理。线程池是由一组预先创建的线程组成的,这些线程可以复用,而不是每次...
Java并发包源码分析(JDK1.8):囊括了java.util.concurrent包中大部分类的源码分析,其中涉及automic包,locks包(AbstractQueuedSynchronizer、ReentrantLock、ReentrantReadWriteLock、LockSupport等),queue...
书中还特别提及了线程池的创建和管理,以及通过ThreadPoolExecutor类的源码分析,揭示线程池的工作原理。 在**基础案例篇**,作者通过实际问题,如并发编程中的常见问题和挑战,引导读者理解并发编程中的可见性和...