码迷,mamicode.com
首页 > 编程语言 > 详细

Java底层技术系列文章-线程池框架

时间:2017-02-07 23:56:47      阅读:344      评论:0      收藏:0      [点我收藏+]

标签:结构图   size   lock   线程   时间   except   tom   log   示例   

一、线程池结构图
    技术分享

 

二、示例

定义线程接口

public class MyThread extends Thread {
@Override
publicvoid run() {
System.out.println(Thread.currentThread().getName() + "正在执行");
}
}
 

1:newSingleThreadExecutor

ExecutorService pool = Executors. newSingleThreadExecutor();

Thread t1 = new MyThread();
Thread t2 = new MyThread();
Thread t3 = new MyThread();
//将线程放入池中进行执行
pool.execute(t1);
pool.execute(t2);
pool.execute(t3);
//关闭线程池
pool.shutdown();

输入结果:
pool-1-thread-1正在执行
pool-1-thread-1正在执行
pool-1-thread-1正在执行

2:newFixedThreadPool

ExecutorService pool = Executors.newFixedThreadPool(3);
Thread t1 = new MyThread();
Thread t2 = new MyThread();
Thread t3 = new MyThread();
Thread t4 = new MyThread();
Thread t5 = new MyThread();
//将线程放入池中进行执行
pool.execute(t1);
pool.execute(t2);
pool.execute(t3);
pool.execute(t4);
pool.execute(t5);
pool.shutdown();

输入结果:
pool-1-thread-1正在执行
pool-1-thread-2正在执行
pool-1-thread-1正在执行
pool-1-thread-2正在执行

3 :newCachedThreadPool

ExecutorService pool = Executors.newCachedThreadPool();
Thread t1 = new MyThread();
Thread t2 = new MyThread();
Thread t3 = new MyThread();
Thread t4 = new MyThread();
Thread t5 = new MyThread();
//将线程放入池中进行执行
pool.execute(t1);
pool.execute(t2);
pool.execute(t3);
pool.execute(t4);
pool.execute(t5);
//关闭线程池
pool.shutdown();

输入结果:
pool-1-thread-2正在执行
pool-1-thread-4正在执行
pool-1-thread-3正在执行
pool-1-thread-1正在执行
pool-1-thread-5正在执行

4 :ScheduledThreadPoolExecutor

ScheduledExecutorService pool = Executors.newScheduledThreadPool(2);
pool.scheduleAtFixedRate(new Runnable() {//每隔一段时间就触发异常
@Override
public void run() {
//throw new RuntimeException();
System.out.println("================");
}
}, 1000, 2000, TimeUnit.MILLISECONDS);
pool.scheduleAtFixedRate(new Runnable() {//每隔一段时间打印系统时间,证明两者是互不影响的
@Override
public void run() {
System.out.println("+++++++++++++++++");
}
}, 1000, 2000, TimeUnit.MILLISECONDS);

输入结果:

================
+++++++++++++++++
+++++++++++++++++
+++++++++++++++++

 

三、线程池核心参数
corePoolSize : 池中核心的线程数
maximumPoolSize : 池中允许的最大线程数。
keepAliveTime : 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。
unit : keepAliveTime 参数的时间单位。
workQueue : 执行前用于保持任务的队列。此队列仅保持由 execute方法提交的 Runnable任务。
threadFactory : 执行程序创建新线程时使用的工厂。
handler : 由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序。
ThreadPoolExecutor :Executors类的底层实现。

3.1 任务排队机制
SynchonousQueue: 同步队列,队列直接提交给线程执行而不保持它们,此时线程池通常是无界的
LinkedBlockingQueue: 无界对列,当线程池线程数达到最大数量时,新任务就会在队列中等待执行,可能会造成队列无限膨胀
ArrayBlockingQueue : 有界队列,有助于防止资源耗尽,一旦达到上限,可能会造成新任务丢失
注意:
newSingleThreadExecutor、newFixedThreadPool使用的是LinkedBlockingQueue
newCachedThreadPool 使用的是 SynchonousQueue
newScheduledThreadPool使用的是 DelayedWorkQueue

3.2 线程执行流程
技术分享 

3.3 线程大小确定:
cpu密集型: 尽量少开线程,最佳线程数 Ncpu+1
io密集型:多开线程,2Ncpu
混合型:根据情况而定,可以拆分成io密集和cou密集

Java底层技术系列文章-线程池框架

标签:结构图   size   lock   线程   时间   except   tom   log   示例   

原文地址:http://www.cnblogs.com/wanwusheng/p/6376311.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!