设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 重新 试卷 文件
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

Java线程池实现原理与技术,看这一篇就够了(6)

发布时间:2019-04-01 12:30 所属栏目:21 来源:程序员柯南
导读:混合型任务,如果可以拆分,将其拆分成一个CPU密集型任务和一个IO密集型任务,只要这两个任务执行的时间相差不是太大,那么分解后执行的吞吐量将高于串行执行的吞吐量。如果这两个任务执行的时间相差很大,则没有必

混合型任务,如果可以拆分,将其拆分成一个CPU密集型任务和一个IO密集型任务,只要这两个任务执行的时间相差不是太大,那么分解后执行的吞吐量将高于串行执行的吞吐量。如果这两个任务执行的时间相差很大,则没有必要进行分解。可以通过Runtime.getRuntime().availableProcessors()方法获得当前设备的CPU个数。

优先级不同的任务可以使用优先级队列PriorityBlockingQueue来处理。它可以让优先级高的任务先执行。

3.7 线程池的监控

由于大量的使用线程池,所以很有必要对其进行监控。可以通过继承线程池来自定义线程池,重写线程池的beforeExecute、afterExecute 和 terminated 方法,也可以在任务执行前,执行后和线程池关闭前执行一些代码来进行监控。在监控线程池的时候可以使用一下属性:

(1) taskCount:线程池需要执行的任务数量

(2) completedTaskCount:线程池在运行过程中已完成的任务数量,小于或等于taskCount

(3) largestPoolSize: 线程池里曾经创建过最大的线程数量。通过这个数据可以知道线程池是否曾经满过。如该数值等于线程池最大大小,则表示线程池曾经满过。

(4) getPoolSize:线程池的线程数量。如果线程池不销毁的话,线程池里的线程不会自动销毁,所以这个大小只增不减。

(5) getActiveCount:获取活动的线程数

04Executor多线程框架

ThreadPoolExecutor 表示一个线程池,Executors 类则扮演着线程池工厂的角色,通过 Executors 可以取得一个特定功能的线程池。

使用 Executors 框架实现上节中的例子,其代码如下:

  1. public static void main(String[] args) { 
  2.         //新建一个线程池 
  3.         ExecutorService executor = Executors.newCachedThreadPool(); 
  4.         //在其它线程中执行100次下列方法 
  5.         for (int i = 0; i < 100; i++) { 
  6.             executor.execute(new Runnable() { 
  7.                 @Override 
  8.                 public void run() { 
  9.                     System.out.println(Thread.currentThread().getName()); 
  10.                 } 
  11.             }); 
  12.         } 
  13.         //执行完关闭 
  14.         executor.shutdown(); 
  15.     } 

4.1 Executors框架的结构

1.任务

包括被执行任务需要实现的接口:Runnable 接口或 Callable 接口。

2.任务的执行

包括任务执行机制的核心接口 Executor,以及继承自 Executor 的ExecutorService 接口。Executor框架有两个关键类实现了 ExecutorService 接口(ThreadPoolExecutor 和 ScheduledThreadPoolExecutor)。

3.异步计算的结果

包括接口 Future 和实现Future接口的FutureTask类。

4.2 Executors工厂方法

Executors工厂类的主要方法:

  1. public static ExecutorService newFixedThreadPool(int nThreads)  

该方法返回一个固定线程数量的线程池,该线程池中的线程数量始终不变。当有一个新的任务提交时,线程池中若有空闲线程,则立即执行。若没有,则新的任务会被暂存在一个任务队列中,待有线程空闲时,便处理在任务队列中的任务。

  1. public static ExecutorService newSingleThreadExecutor() 

该方法返回一个只有一个线程的线程池。若多余一个任务被提交到线程池,任务会被保存在一个任务队列中,待线程空闲,按先入先出的顺序执行队列中的任务。

  1. public static ExecutorService newCachedThreadPool() 

该方法返回一个可根据实际情况调整线程数量的线程池。线程池的线程数量不确定,但若有空闲线程可以复用,则会优先使用可复用的线程。但所有线程均在工作,又有新的任务提交,则会创建新的线程处理任务。所有线程在当前任务执行完毕后,将返回线程池进行复用。

  1. public static ScheduledExecutorService newSingleThreadScheduledExecutor()  

该方法返回一个ScheduledExecutorService对象,线程池大小为1。ScheduledExecutorService接口在ExecutorService接口之上扩展了在给定时间执行某任务的功能,如在某个固定的延时之后执行,或者周期性执行某个任务。

  1. public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) 

该方法也返回一个 ScheduledExecutorService 对象,但该线程池可以指定线程数量。

4.3 ThreadPoolExecutor与ScheduledThreadPoolExecutor

在前面提到了Executors 类扮演着线程池工厂的角色,通过 Executors 可以取得一个特定功能的线程池。Executors 工厂类的主要方法可以创建 ThreadPoolExecutor 和 ScheduledThreadPoolExecutor 线程池。

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读