深入学习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