一文带你读懂Java线程池框架

今天就跟大家聊聊有关一文带你读懂Java 线程池框架,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名申请、虚拟空间、营销软件、网站建设、湾里网站维护、网站推广。

一、线程池结构图

一文带你读懂Java 线程池框架

二、示例

定义线程接口

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 线程执行流程

一文带你读懂Java 线程池框架

3.3 线程大小确定:

cpu密集型: 尽量少开线程,最佳线程数 Ncpu+1

io密集型:多开线程,2Ncpu

混合型:根据情况而定,可以拆分成io密集和cou密集

看完上述内容,你们对一文带你读懂Java 线程池框架有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。


文章名称:一文带你读懂Java线程池框架
URL网址:http://scyanting.com/article/pcsjci.html