深入学习JDK 线程池(之三)
来源:互联网 发布:oracle数据库安全策略 编辑:程序博客网 时间:2024/05/22 10:26
一、环境准备
由于本章节主要是向大家介绍线程池的内部实现逻辑,需要进行断点调试跟踪JDK的源代码,而默认下载的JDK版本,断点调试时无法显示变量的值,所以需要大家另外下载debug版的JDK,并设置在eclipse开发环境中,有许多前辈已经分享过安装配置debug jdk的经验了,这儿就不再赘述了。
二、演示代码
演示代码非常简易,非常简单的实现,分三个类:一个Runnable实现类,一个Callable实现类,一个Client类。主要是引导大家开启调试源码的入口。
/** * Runnable对象 * 为了简便,run()方法内只是休眠了3秒,然后打印该对象 */public class CountThread implements Runnable {private static long counter = 0;private final long id = counter++;@Overridepublic void run() {try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(this);}@Overridepublic String toString() {return "CountThread: " + id;}}
/** * Callable对象 * 为了简便,run()方法内只是休眠了3秒,然后返回该对象 */public class CountTask implements Callable<String> {private static long counter = 0;private final long id = counter++;@Overridepublic String call() throws Exception {try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}return this.toString();}@Overridepublic String toString() {return "CountTask: " + id;}}
/** * 线程池特性演示类 */public class ThreadPoolFeature {public static void main(String[] args) {//创建线程池,由Executors产生不同的线程池,目前为CachedThreadPoolExecutorService exec = Executors.newCachedThreadPool();List<Future<String>> fs = new ArrayList<Future<String>>();for (int i = 0; i < 10; i++) {//验证Runnable和Callabe两种线程对象exec.execute(new CountThread());fs.add(exec.submit(new CountTask()));}try {for (Future<String> f : fs) {System.out.println(f.get());}} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}//关闭线程池exec.shutdown();}}
三、基本思路
1、分析线程池实现的整体结构,包括主要的内部类,成员变量和实现方法。
2、宏观地分析线程池的主要方法,如newXXXThreadPool(...),execute(...),submit(...),shutdown(...),观察类似功能的方法 ,是否有相互调用的情况,其中newXXXThreadPool(...)已经在前面的章节讲解过。
3、使用断点调试进行跟踪线程池执行的流程。
1 0
- 深入学习JDK 线程池(之三)
- 深入学习JDK 线程池(之二)
- 深入学习JDK 线程池(之四)
- 深入学习JDK 线程池(之五)
- 深入学习JDK 线程池(之六)
- 深入学习JDK 线程池(之七)
- 深入学习JDK 线程池(之一)
- 对线程的深入学习(三)
- JDK源码走读之深入理解线程池(ThreadPoolExecutor)
- JDK并发包线程池(三)自定义线程池
- jdk源码学习:线程池
- 线程学习之三_线程结束
- 线程学习(三)
- 深入学习keepalived之预备工作--线程
- 深入Java之线程池
- java线程池深入三-Worker
- JNI学习之步步深入三
- JNI学习之步步深入三
- 汇编中有符号与无符号数的区分
- Java:自定义Annotation
- Modular Inverse(模线性方程)
- Codeforces Beta Round #87 (Div. 2) / 116D Lawnmower (讨论情况)
- 运放中输入偏置电流和输入失调电流的区别??
- 深入学习JDK 线程池(之三)
- 汉诺塔C递归算法详细解答
- js正则表达式总结
- Java空字符串与null区别:
- 《PHP和MySQL Web开发》学习笔记:4~5章
- JavaScript截取字符串方法详解
- ArcGIS Runtime SDK for iOS开发系列教程(4)——如何让你的iOS应用具有GIS能力
- CodeCombat-辱骂
- Linux内核设计的艺术-文件操作