如何监控线程池?
现在很多公司开始重视线程池的使用情况,所以掌握监控线程池很有必要。线程池一共有两个点需要监控,第一个点是线程的变化情况,
第二个点是任务的变化情况。
上面这三个方法是用来监控线程的变化情况。
下面这三个方法是用来监控任务的变化情况,
接下来自定义一个带监控功能的线程池,然后继承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个方法就可以实现对象征值的监控,在实际开发中当然不是把这些参数打印出来,而是写在日志中或者是写在服务器某块地方,通过客户端可以随时查看。