首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏服务端技术杂谈

    线程监控

    系统中大量使用线程,有必要对线程进行监控。 可以监控如下指标: 可以检测到正在执行的线程数。 可以检测任务队列堆积任务数。 可以检测活动线程数。 可以检测最大线程数。 ? 具体如下: queue.size:获取线程任务队列数量。 taskCount:线程需要执行的任务数量。 completedTaskCount:线程在运行过程中已完成的任务数量。 largestPoolSize:线程曾经创建过的最大线程数量。通过这个数据可以知道线程是否满过。如等于线程的最大大小,则表示线程曾经满了。 getPoolSize:线程线程数量。 通过扩展线程进行监控,通过继承线程并重写线程的beforeExecute,afterExecute和terminated方法,我们可以在任务执行前,执行后和线程关闭前干一些事情。 如监控任务的平均执行时间,最大执行时间和最小执行时间等。 这几个方法在线程池里是空方法。

    1.1K10发布于 2018-09-21
  • 来自专栏同步文章

    线程监控

    线程配置核心业务线程和非核心业务线程 核心业务的线程不够用 可以停掉非核心业务占用的线程 application.properties #线程配置 gmall.pool.coreSize=8 27 * @Description: 线程配置参数 */ @Data @Configuration @ConfigurationProperties(prefix = "gmall.pool") 27 * @Description: 配置当前系统的线程信息 */ @Configuration public class ThreadPoolConfig { /** * 核心线程 //高并发系统的优化 //1、加缓存 //2、开异步 return null; } } 监控线程: package com.xiepanpan.gmall.portal.controller 28 * @Description: 监控线程 */ @RestController public class ThreadPoolController { @Qualifier("mainThreadPoolExecutor

    46010编辑于 2022-10-25
  • 来自专栏阿杜的世界

    Java线程监控小结

    最近我们组杨青同学遇到一个使用线程不当的问题:异步处理的线程线程将主线程hang住了,分析代码发现是线程的拒绝策略设置得不合理,设置为CallerRunsPolicy。 从这个问题中,我们学到了两点: 线程的使用,需要充分分析业务场景后作出选择,必要的情况下需要自定义线程线程的运行状况,也需要监控 关于线程监控,我参考了《Java编程的艺术》中提供的思路实现的 DEFAULT_QUEUE_SIZE; @Setter private int poolSize = DEFAULT_POOL_SIZE; /** * 用于周期性监控线程的运行状态 ;(2)拒绝策略是将任务丢弃,但是需要记录错误日志;(3)使用一个调度线程对业务线程进行监控。 在查看监控日志的时候,看到下图所示的监控日志: ?

    2K20发布于 2018-08-06
  • 来自专栏857-Bigdata

    详解Java线程监控

    - 线程名称 = 被监控线程2, 提交任务数+1 [ThreadPoolMonitor_0] INFO PoolMonitorTask - 线程名称 = 被监控线程2, 活跃线程数峰值 = 被监控线程2, 提交任务数+1 [main] INFO MonitoredThreadPoolExecutor - 线程名称 = 被监控线程2, 提交任务数+1 [被监控线程2_0] INFO - 任务0 [被监控线程2_0] INFO MonitoredThreadPoolExecutor - 线程名称 = 被监控线程2, 任务排队时间 = 0, 任务执行时间 = 0 [被监控线程 线程名称 = 被监控线程2, 提交任务数+1 [被监控线程2_0] INFO MonitoredThreadPoolExecutorTest - 增强beforeExecute0 [main - 任务2 [被监控线程2_0] INFO MonitoredThreadPoolExecutor - 线程名称 = 被监控线程2, 任务排队时间 = 0, 任务执行时间 = 0 [被监控线程

    3.4K20编辑于 2022-05-17
  • 来自专栏落叶飞翔的蜗牛

    线程原理(2

    接上文线程原理(1) 线程的创建 通过ThreadPoolExecutor构造函数实现(推荐) ? 线程执行流程 任务缓冲 任务缓冲模块是线程能够管理任务的核心部分。线程的本质是对任务和线程的管理,而做到这一点最关键的思想就是将任务和线程两者解耦,不让两者直接关联,才可以做后续的分配工作。 线程大小确定 线程数量的确定一直是困扰着程序员的一个难题,大部分程序员在设定线程大小的时候就是随心而定。 很多人甚至可能都会觉得把线程配置过大一点比较好!我觉得这明显是有问题的。 I/O 密集型任务(2N):这种任务应用起来,系统会用大部分的时间来处理 I/O 交互,而线程在处理 I/O 的时间段内不会占用 CPU 来处理,这时就可以将 CPU 交出给其它线程使用。 因此在 I/O 密集型任务的应用中,我们可以多配置一些线程,具体的计算方法是 2N。 如何判断是 CPU 密集任务还是 IO 密集任务?

    67710发布于 2021-03-19
  • 来自专栏九州牧云

    扩展ThreadPoolExecutor实现线程监控

    但是,线程使用不当也会使服务器资源枯竭,导致异常情况的发生,比如固定线程的阻塞队列任务数量过多、缓存线程创建的线程过多导致内存溢出、系统假死等问题。 因此,我们需要一种简单的监控方案来监控线程的使用情况,比如完成任务数量、未完成任务数量、线程大小等信息。 ExecutorsUtil工具类 以下是我们开发的一个线程工具类,该工具类扩展ThreadPoolExecutor实现了线程监控功能,能实时将线程使用信息打印到日志中,方便我们进行问题排查、系统调优 统计任务耗时、初始线程数、核心线程数、正在执行的任务数量、已完成任务数量、任务总数、队列里缓存的任务数量、池中存在的最大线程数、最大允许的线程数、线程空闲时间、线程是否关闭、线程是否终止信息 监控到的记录如下 : momentspush-pool-2-thread-90 ExecutorsUtil.java:91 momentspush_monitor: Duration: 599 ms, PoolSize:

    3.7K30发布于 2019-08-21
  • 来自专栏CodeNone

    【多线程线程源码(2

    废话不多说,开始我们的线程源码的第二轮阅读。 回顾 简单回顾下上一篇线程源码中涉及的两个方法,一个是execute() 执行任务的入口,还有一个是addWorker() 最通俗地理解就是是否需要添加新线程。 开始是一个循环,要么执行worker自带的第一个任务(firstTask),要么通过getTask() 获取任务 有任务首先得保证线程是正常的,以下两种情况均调用wt.interrupt() 给「线程设置中断标志位 」 线程处于STOP状态,也就是不接受新任务,也不执行队列中的任务 如果线程的标志位已经为true,那么清楚标志位,此时的线程状态为STOP状态,这里看起来可能比较别扭,有了第一种情况为什么还要第二种 一进来也是一个死循环,可以先聚焦「什么时候会退出循环」,肯定是「不正常的情况」下会退出 当线程状态不处于RUNNING或者SHUTDOWN的时候,或者是当线程处于SHUTDOWN但是工作队列中没有任务

    38330发布于 2021-08-10
  • 来自专栏Java识堂

    线程实现原理-2

    前言 线程实现原理-1 addWorker实现 在看addWorker方法之前,我们先看一个例子,了解一下retry的使用 break retry 跳到retry处,且不再进入循环 continue = null || workQueue.isEmpty) * 1.如果当前线程的状态>SHUTDOWN,addWorker返回false,添加任务失败 * 2.如果当前线程的状态 workerStarted) addWorkerFailed(w); } return workerStarted; } 仔细理解一下这段代码,其实就能理解,当线程处于 // 1.核心线程允许被销毁 // 2.核心线程数 > corePoolSize boolean timed = allowCoreThreadTimeOut || wc 2.wc > maximumPoolSize肯定要删除线程了 // 3.workQueue为空可以销毁线程,此时有可能所有线程都被销毁了 // 4.workQueue不为空

    81430发布于 2019-08-13
  • 来自专栏用户1337634的专栏

    自带监控&兼容MDC的线程

    在使用slf4j的MDC做日志跟踪的时候,会因为MDC不能跨线程导致跟踪失败,此外,为了监控线上服务器的运行状态,也很有必要对线程的运行情况进行监控。 下面是一个带有线程监控且兼容MDC的线程,建议使用! /** * A SLF4J MDC-compatible {@link ThreadPoolExecutor}. MDC.setContextMap(previous); } } }; } } 参考 如何在线程池中使用 线程的五种状态 Java线程监控小结

    1.2K20发布于 2019-03-27
  • 来自专栏程序猿~

    java - 如何监控线程堆积任务

    InterruptedException { ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor)Executors.newFixedThreadPool(2) e.printStackTrace(); } })); } Thread.sleep(3000); // out => 等待线程 threadPoolExecutor.getQueue().size()); } 获取到堆积大小了,就可以通过打印日志的形式进行输出,也可以通过micrometer + prometheus + grafana进行完整的监控 ,可参考 通过micrometer实时监控线程的各项指标 拓展: ThreadPoolExecutor支持其他数量监控,例如: ?

    1.8K20发布于 2021-04-13
  • 来自专栏测试基础

    【Java多线程-2】Java线程详解

    提高线程的可管理性:使用线程可以对线程进行统一的分配,调优和监控2 线程的创建 Executors中提供了一系列静态方法创建线程: newSingleThreadExecutor:一个单线程线程。如果因异常结束,会再创建一个新的,保证按照提交顺序执行。 通过 ctl.get() 得到线程的当前线程数,如果线程数小于corePoolSize,则调用 **addWorker(commond,true)** 方法创建新的线程执行任务,否则执行步骤22. 且条件2不满足,则返回false * 4.条件2解读:线程为shutdown状态时且任务队列不为空时,可以新增空任务的线程来处理队列中的任务 */ 如果当前线程是突然终止的,调用addWorker()创建工作线程 2. 当前线程不是突然终止,但当前工作线程数量小于线程需要维护的线程数量,则创建工作线程

    1.6K40发布于 2020-09-16
  • 来自专栏Vincent-yuan

    线程之ThreadPoolExecutor使用(2)

    vs submit() execute()方法用于提交不需要返回值的任务,所以无法判断任务是否被线程执行成功与否; submit()方法用于提交需要返回值的任务。 线程会返回一个 Future 类型的对象,通过这个 Future 对象可以判断任务是否执行成功 ,并且可以通过 Future 的 get()方法来获取返回值,get()方法会阻塞当前线程直到任务完成, ,线程的状态变为 SHUTDOWN。 线程不再接受新任务了,但是队列里的任务得执行完毕。 shutdownNow() :关闭线程线程的状态变为 STOP。 线程会终止当前正在运行的任务,并停止处理排队的任务并返回正在等待执行的 List。

    63140发布于 2021-07-23
  • 来自专栏数据云团

    并发篇-python线程-2

    线程: 相当于生产者,只管向线程提交任务。并不关心线程是如何执行任务的。因此,并不关心是哪一个线程执行的这个任务。 线程: 相当于消费者,负责接收任务,并将任务分配到一个空闲的线程中去执行。 python内置进程 ? >>>执行结果 ? # 必须要有一个 main 测试 >>> if __name__ == "__main__": # Pool 的实例化必须在 main 测试之下 >>>pool = Pool(2) 的其他操作 操作一 操作二: terminate - 中止进程,中止所有任务。 # 会阻塞,知道结果产生了 >>> result = a_result.get() 使用线程来实现并发服务器 ? >>>客户端 ? >>>执行结果 ?

    68130发布于 2019-07-18
  • 来自专栏Throwable's Blog

    通过micrometer实时监控线程的各项指标

    考虑到之前用micrometer + prometheus + grafana搭建过监控体系,于是考虑使用micrometer做一次主动的线程度量数据采集,最终可以相对实时地展示在grafana的面板中 2、提供两个方法,分别使用线程实例模拟短时间耗时的任务和长时间耗时的任务。 3、提供一个方法用于清空线程实例中的任务队列。 F:thread_pool_queue_size,Legend:-线程积压任务数。 最终效果 多调用几次例子中提供的几个接口,就能得到一个监控线程呈现的图表: ? 小结 针对线程ThreadPoolExecutor的各项数据进行监控,有利于及时发现使用线程的接口的异常,如果想要快速恢复,最有效的途径是:清空线程池中任务队列中积压的任务。 像HTTP客户端的连接如Apache-Http-Client或者OkHttp等的监控,可以用类似的方式实现,数据收集的时候可能由于加锁等原因会有少量的性能损耗,不过这些都是可以忽略的,如果真的怕有性能影响

    5K10发布于 2020-06-23
  • 来自专栏java跬步

    线程-线程源码详解

    位表示工作线程数,最左边3位表示线程状态。 ); } 第2处 发生拒绝的原因有两个(1)线程状态非Runing (2)等待队列已满。 /** * 根据当前线程状态,检查是否可以添加新的任务线程,如果可以则创建并启动任务 * 如果一切正常则返回true。 返回false 的可能如下: * 1.线程没有处于RUNNING状态 * 2.线程工程创建新的任务线程失败 * @param firstTask 外部启动线程时需要构造的第一个线程 corePoolSize : maximumPoolSize)) // 最大线程数不能超过2^29,否则影响左边3位的线程状态值 return false;

    2K12发布于 2020-02-18
  • 来自专栏java跬步

    线程-线程的好处

    所以需要通过线程协调多个线程,并实现类似主次线程隔离、定时执行、周期执行等任务。线程的作用包括: 利用线程管理并复用线程、控制最大并发数等。 实现任务线程队列缓存策略和拒绝机制。 在了解线程的基本作用后,我们学习一下线程是如何创建线程的。 这个值的设置非常关键,设置过大会浪费资源,设置的过小会导致线程频繁地创建或销毁。 第2个参数:maximumPoolSize 表示线程能够容纳同时执行的最大线程数。 从代码第2处来看,队列、线程工程、拒绝处理服务都必须有实例对象,但在实际编码中,很少有程序员对着三者进行实例化,而通过Executors这个线程静态工厂提供默认实现,那么Executors与ThreadPoolExecutor execute(task1); } } } 当任务被拒绝的时候,拒绝策略会打印出当前线程的大小以及达到了maximumPoolSize=2 ,且队列已满。

    1.9K21发布于 2020-02-18
  • 来自专栏韩曙亮的移动开发专栏

    【Android 异步操作】线程 ( 线程作用 | 线程种类 | 线程工作机制 | 线程任务调度源码解析 )

    文章目录 一、线程作用 二、线程种类 三、线程工作机制 四、线程任务调度源码解析 一、线程作用 ---- 线程作用 : ① 避免创建线程 : 避免每次使用线程时 , 都需要 创建线程对象 ; ---- 线程种类 : ① newCachedThreadPool : 可缓存线程 , 如果 线程线程个数已满 , 回收空闲线程 , 如果没有空闲线程 , 此时会创建新线程 ; ② newFixedThreadPool 后到的后执行 ) , LIFO 后入先出 ( 后到的先执行 ) ; 三、线程工作机制 ---- 线程线程相关概念: 线程数 : 线程的 有 最大线程数 MaxSzie , 核心线程数 CoreSize , 任务拒绝后 , 处理善后 ; 四、线程任务调度源码解析 ---- 在 AsyncTask.java 中 , 在静态代码块中 , 自己 自定义创建了线程 , 没有使用上述四种线程 ; 创建线程时传入的参数 * 调用 addWorker 方法会检查运行状态, 和线程运行个数, 避免在不应该添加线程时执行错误操作. * * 2.

    1.5K00编辑于 2023-03-28
  • 来自专栏韩曙亮的移动开发专栏

    【Android 异步操作】线程 ( 线程简介 | 线程初始化方法 | 线程种类 | AsyncTask 使用线程示例 )

    文章目录 一、线程简介 二、线程初始化方法简介 三、线程使用示例 一、线程简介 ---- 线程一般是实现了 ExecutorService 接口的类 , 一般使用 ThreadPoolExecutor , 合理控制并发数 , 能提高 CPU 使用效率 ; 二、线程初始化方法简介 ---- 线程初始化方法简介 : newCachedThreadPool : 创建 可缓存线程 ; 如果线程长度超过处理需要 newScheduledThreadPool : 创建 定长周期任务线程 ; 该线程支持周期性任务执行 ; newSingleThreadExecutor : 创建 单线程线程 ; 该线程只有一个工作线程 是 自己配置的线程 , 没有使用 Java 默认提供的四种线程 , Java 提供的四种线程是 可缓存线程 , 定长线程 , 定长周期任务线程 , 单线程线程 ; THREAD_POOL_EXECUTOR : 线程线程分类 : 线程线程分为 核心线程 , 非核心线程 两类 ; 非核心线程闲置时间 : 非核心线程 超过一定的闲置时间 , 就会被回收 ; 假设线程最大线程数是 8 , 核心线程

    3.7K01编辑于 2023-03-28
  • 来自专栏Alan的blog

    线程,进程

    concurrent.futures --- 启动并行任务 — Python 3.7.13 文档concurrent.futures 模块提供异步执行可调用对象高层接口异步执行可以由 ThreadPoolExecutor 使用线程或由 **Executor**ThreadPoolExecutor 线程```pythonimport concurrent.futuresimport urllib.requestURLS = ['http exc)) else: print('%r page is %d bytes' % (url, len(data)))```ProcessPoolExecutor 进程使用进程来实现异步执行调用 112272535095293, 115280095190773, 115797848077099, 1099726899285419]def is_prime(n): if n % 2 = 0: return False sqrt_n = int(math.floor(math.sqrt(n))) for i in range(3, sqrt_n + 1, 2)

    1.5K00编辑于 2023-05-04
  • 来自专栏南桥谈编程

    线程线程的实现 | 日志

    像这种,提前创建好线程,需要的时候直接使用,我们称之为线程。这种本质上就是一个生产消费模型。 线程实现 //ThreadPool.hpp #pragma once #include<iostream> #include<unistd.h> #include<string> #include< tm_sec); return std::string(buffer); } #define SCREEN_TYPE 1 #define FILE_TYPE 2 lg.Enable(SCREEN_TYPE);}while(0) #define EnableFile() do{lg.Enable(FILE_TYPE);}while(0) }; 携带日志的线程设计 Task>(); tp->Init(); tp->Start(); int cnt=10; while (cnt) { // 不断地向线程推送任务

    60010编辑于 2024-10-02
领券