• 18.如何监控线程池?


    如何监控线程池?

    现在很多公司开始重视线程池的使用情况,所以掌握监控线程池很有必要。线程池一共有两个点需要监控,第一个点是线程的变化情况,

     

    第二个点是任务的变化情况。

    上面这三个方法是用来监控线程的变化情况。

     

    下面这三个方法是用来监控任务的变化情况,

    接下来自定义一个带监控功能的线程池,然后继承threadPoolExecutor,接着重载构造方法。

    另一个监控功能的方法,

    monitor依次监控正在工作的线程数和当前存在的线程数,以及历史最大的线程数,这三个是与线程变化相关的。


    接着依次监控已提交的任务数和已完成的任务数
    ,以及队列中的任务数,这三个是与任务变化相关的。至此监控方法编写完成,

    重写before executor方法,该方法每次任务执行前调用,在他内部调用一遍monitor方法,每当有任务执行的时候,输出一次线程池的情况,

    接着重写afterexecutor方法,该方法每次任务完成后调用,在它内部也调用一遍monitor方法,每当有任务完成的时候,输出一次线程池的情况,

    最后重写terminated的方法。该方法在线程池关闭前调用,同样的,在它的内部也调用一遍monitor方法,

    当线程池关闭前一刻,我们可以了解到线程池最后的情况,至此整个带监控功能的线程池编写完成,

    下面来试试它。 


    制定一个任务
    task,实现runnable接口,定义一个int类型的变量timeout,表示任务执行时长,重载构造方法用于初始化timeout,任务内容是使当前线程休眠,以此来模拟任务执行时长。

    接下来使用带监控功能的线程池,执行该任务。首先创建一个带监控功能的限制值,并指定核心线程数为1,最大线程数为三,空闲线程存活时间为0秒,任务队列采用linkedblockingqueue,并指定队列长度为二,接着使用for循环。从5~1提交5个任务,创建任务并指定任务执行时长为I,接着提交任务,每隔500毫秒提交一个,sleep方法有异常抛出使用try---catch将其捕获。 


    任务提交完以后,我们使主线程休眠
    6秒钟,这样做的目的在于,想在关闭线程池之前获取一次线程池的情况,最后写上finally代码块,在finally代码块中调用shoudown方法关闭线程池。至此main方法编写完成,

    整个例子也编写完成。执行程序,

    观察执行结果。从执行结果来看,

    线程池各项参数的变化情况一目了然。

    总结

    最后总结一下本节内容,本节介绍了如何监控线程池,利用这6个方法就可以实现对象征值的监控,在实际开发中当然不是把这些参数打印出来,而是写在日志中或者是写在服务器某块地方,通过客户端可以随时查看。 


      

    附录:

    笔记完整文本:

    现在很多公司开始重视线程池的使用情况,所以掌握监控线程池很有必要。线程池一共有两个点需要监控,第一个点是线程的变化情况,第二个点是任务的变化情况。上面这三个方法是用来监控线程的变化情况。下面这三个方法是用来监控任务的变化情况,接下来自定义一个带监控功能的线程池,然后继承threadPoolExecutor,接着重载构造方法。另一个监控功能的方法,monitor依次监控正在工作的线程数和当前存在的线程数,以及历史最大的线程数,这三个是与线程变化相关的。 接着依次监控已提交的任务数和已完成的任务数,以及队列中的任务数,这三个是与任务变化相关的。至此监控方法编写完成,重写before executor方法,该方法每次任务执行前调用,在他内部调用一遍monitor方法,每当有任务执行的时候,输出一次线程池的情况,接着重写afterexecutor方法,该方法每次任务完成后调用,在它内部也调用一遍monitor方法,每当有任务完成的时候,输出一次线程池的情况,最后重写terminated的方法。该方法在线程池关闭前调用,同样的,在它的内部也调用一遍monitor方法,当线程池关闭前一刻,我们可以了解到线程池最后的情况,至此整个带监控功能的限制池编写完成,下面来试试它。 制定一个任务task,实现runnable接口,定义一个int类型的变量timeout,表示任务执行时长,重载构造方法用于初始化timeout,任务内容是使当前线程休眠,以此来模拟任务执行时长。接下来使用带监控功能的线程池,执行该任务。首先创建一个带监控功能的限制值,并指定核心线程数为1,最大线程数为三,空闲线程存活时间为0秒,任务队列采用linkedblockingqueue,并指定队列长度为二,接着使用for循环。从5~1提交5个任务,创建任务并指定任务执行时长为I,接着提交任务,每隔500毫秒提交一个,sleep方法有异常抛出使用try---catch将其捕获。 任务提交完以后,我们使主线程休眠6秒钟,这样做的目的在于,想在关闭线程池之前获取一次线程池的情况,最后写上finally代码块,在finally代码块中调用shoudown方法关闭线程池。至此main方法编写完成,整个例子也编写完成。执行程序,观察执行结果。从执行结果来看,线程池各项参数的变化情况一目了然。最后总结一下本节内容,本节介绍了如何监控线程池,利用这6个方法就可以实现对象征值的监控,在实际开发中当然不是把这些参数打印出来,而是写在日志中或者是写在服务器某块地方,通过客户端可以随时查看。

     

  • 相关阅读:
    python psutil监控系统资源【转】
    nc用法【转】
    python enumerate用法总结【转】
    find查找时排除目录及文件
    python自动安装mysql5.7【转】
    Nginx报错:upstream timed out (110: Connection timed out)和client intended to send too large body【转】
    linux压缩日志并删除原始文件
    mysql5.7主从复制--在线变更复制类型【转】
    MySQL 5.7在线设置复制过滤【转】
    Linux dd命令中dsync与fdatasync的区别【转】
  • 原文地址:https://www.cnblogs.com/cj8357475/p/16032878.html
Copyright © 2020-2023  润新知