您的位置:首页 > 编程语言 > Java开发

深入学习JDK 线程池(之三)

2014-03-09 11:24 337 查看
一、环境准备

       由于本章节主要是向大家介绍线程池的内部实现逻辑,需要进行断点调试跟踪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++;

@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(this);
}

@Override
public String toString() {
return "CountThread: " + id;
}
}

 

/**
* Callable对象
* 为了简便,run()方法内只是休眠了3秒,然后返回该对象
*/
public class CountTask implements Callable<String> {

private static long counter = 0;
private final long id = counter++;

@Override
public String call() throws Exception {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return this.toString();
}

@Override
public String toString() {
return "CountTask: " + id;
}
}

 

/**
* 线程池特性演示类
*/
public class ThreadPoolFeature {

public static void main(String[] args) {
//创建线程池,由Executors产生不同的线程池,目前为CachedThreadPool
ExecutorService 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、使用断点调试进行跟踪线程池执行的流程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息