avatar
文章
360
标签
49
分类
10
首页
时间轴
分类
关于
Logo只有那年胜过年年
搜索
首页
时间轴
分类
关于

只有那年胜过年年

教你如何监控 Java 线程池运行状态
发表于2025-10-14|后端
如果你想监控某一个线程池的执行状态,线程池执行类 ThreadPoolExecutor 也给出了相关的 API, 能实时获取线程池的当前活动线程数、正在排队中的线程数、已经执行完成的线程数、总线程数等。 总线程数 = 排队线程数 + 活动线程数 + 执行完成的线程数。 下面给出一个线程池使用示例,及教你获取线程池状态。 private static ExecutorService es = new ThreadPoolExecutor(50, 100, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(100000)); public static void main(String[] args) throws Exception { for (int i = 0; i < 100000; i++) { es.execute(() -> { System.out.print(1); try &...
sleep( )和wait( )的这5个区别,你知道几个?
发表于2025-10-14|后端
sleep(休眠) 和 wait(等待) 方法是 Java 多线程中常用的两个方法,它们有什么区别及一些该注意的地方有哪些呢?下面给大家一一分解。 在之前的文章《Java多线程神器:join使用及原理》介绍了,它其实用的是 wait 实现的线程等待。 区别1:使用限制使用 sleep 方法可以让让当前线程休眠,时间一到当前线程继续往下执行,在任何地方都能使用,但需要捕获 InterruptedException 异常。 try { Thread.sleep(3000L); } catch (InterruptedException e) { e.printStackTrace(); } 而使用 wait 方法则必须放在 synchronized 块里面,同样需要捕获 InterruptedException 异常,并且需要获取对象的锁。 synchronized (lock){ try { lock.wait(); } catch (InterruptedException...
面试官问线程安全的List,看完再也不怕了!
发表于2025-10-14|后端
最近在Java技术知识星球里面有球友问到了线程安全的 List: 扫码查看答案或加入知识星球 栈长在之前的文章《出场率比较高的一道多线程安全面试题》里面讲过 ArrayList 的不安全性。 那么面试官会问你,既然 ArrayList 是线程不安全的,怎么保证它的线程安全性呢?或者有什么替代方案? 往下看,看我如何碾压他! 大部分人会脱口而出:用Vector,这样只会让面试官鄙视!除了Vector,你还会别的吗? 你至少还得说得上这种: java.util.Collections.SynchronizedList 它能把所有 List 接口的实现类转换成线程安全的List,比 Vector 有更好的扩展性和兼容性,SynchronizedList的构造方法如下: final List<E> list; SynchronizedList(List<E> list) { super(list); this.list = list; } SynchronizedList的部分方法源码如下: public E...
线程休眠只会用Thread.sleep?那就弱爆了!
发表于2025-10-14|后端
线程休眠是 Java 开发经常会用到的一个手段,就是让当前线程睡一会儿,睡醒之后再继续运行。 咱大多数程序员,多线程虽然学得不好,但线程休眠,无人不知,无人不晓,也都会用,不就是用 Thread.sleep 方法嘛!而且还将它用到那么绝,之前不是还有人写过休眠排序算法和休眠取时间的算法,再来回味下这么脑洞大开的两个算法: 休眠排序算法 休眠取时间算法 笑过之后,当然,这不是咋今天要讲的主题,栈长今天要讲的是如何更优雅的让线程休眠。 来看下面的休眠程序: Thread.sleep(87000000); 你知道休眠多久吗? 醉了…… 再把上面的稍微改装下: Thread.sleep(24 * 60 * 60 * 1000 + 10 * 60 * 1000); 现在你估计大概能知道休眠多久了,但还是很茫然,很无助,不写注释,谁知道休眠多久?单位还是毫秒。。 其实就是休眠 24 小时 10 分钟,何必整这么麻烦呢? 优雅又简单的方式来了: TimeUnit.DAYS.sleep(1); TimeUnit.MINUTES.sleep(10); 或者 TimeUnit.HOUR...
多线程 start 和 run 方法到底有什么区别?
发表于2025-10-14|后端
首先要知道实现多线程最基本的两种方式: 1、继承 java.lang.Thread 类; 2、实现 java.lang.Runnable接口; 其中 Thread 类也是实现了 Runnable 接口,而 Runnable 接口定义了唯一的一个 run() 方法,所以基于 Thread 和 Runnable 创建多线程都需要实现 run() 方法,是多线程真正运行的主方法。 @FunctionalInterface public interface Runnable { public abstract void run(); } 而 start() 方法则是 Thread 类的方法,用来异步启动一个线程,然后主线程立刻返回。该启动的线程不会马上运行,会放到等待队列中等待 CPU 调度,只有线程真正被 CPU 调度时才会调用 run() 方法执行。 所以 start() 方法只是标识线程为就绪状态的一个附加方法,以下 start() 方法的源码,其中 start0() 是一个本地 native 方法。 public synchronized void ...
Java多线程可以分组还能这样玩
发表于2025-10-14|后端
但如果线程很多的情况下,你知道如何对它们进行分组吗? 和 Dubbo 的服务分组一样,Java 可以对相同性质的线程进行分组。 来看下线程类 Thread 的所有构造方法。 如图所示,带有 ThreadGroup 的所有线程构造方法都可以定义线程组的。 线程组使用 java.lang.ThreadGroup 类定义,它有两个构造方法,第二个构造方法允许线程组有父类线程组,也就是说一个线程组可以多个子线程组。 java.lang.ThreadGroup#ThreadGroup(java.lang.String) java.lang.ThreadGroup#ThreadGroup(java.lang.ThreadGroup, java.lang.String) 线程组中比较有用的几个方法。 // 获取当前线程组内的运行线程数java.lang.ThreadGroup#activeCount // 中断线程组内的所有线程java.lang.ThreadGroup#interrupt // 使用 System.out 打...
Java多线程join使用及原理
发表于2025-10-14|后端
join()join()是线程类Thread的方法,官方的说明是: Waits for this thread to die. 等待这个线程结束,也就是说当前线程等待这个线程结束后再继续执行,下面来看这个示例就明白了。 示例public static void main(String[] args) throws Exception { System.out.println("start"); Thread t = new Thread(() -> { for (int i = 0; i < 5; i++) { System.out.println(i); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } }); t.start(); t.join(); ...
i++是线程安全的吗?
发表于2025-10-14|后端
i++ 是线程安全的吗? 相信很多中高级的 Java 面试者都遇到过这个问题,很多对这个不是很清楚的肯定是一脸蒙逼。内心肯定还在质疑,i++ 居然还有线程安全问题?只能说自己了解的不够多,自己的水平有限。 先来看下面的示例来验证下 i++ 到底是不是线程安全的。 1000个线程,每个线程对共享变量 count 进行 1000 次 ++ 操作。 static int count = 0; static CountDownLatch cdl = new CountDownLatch(1000); /** * */ public static void main(String[] args) throws Exception { CountRunnable countRunnable = new CountRunnable(); for (int i = 0; i < 1000; i++) { new Thread(countRunnable).start(); } cd...
JVM运行时区域详解
发表于2025-09-14|后端
我们知道的JVM内存区域有:堆和栈,这是一种泛的分法,也是按运行时区域的一种分法,堆是所有线程共享的一块区域,而栈是线程隔离的,每个线程互不共享。 线程不共享区域每个线程的数据区域包括程序计数器、虚拟机栈和本地方法栈,它们都是在新线程创建时才创建的。 程序计数器(Program Counter Rerister)程序计数器区域一块内存较小的区域,它用于存储线程的每个执行指令,每个线程都有自己的程序计数器,此区域不会有内存溢出的情况。 虚拟机栈(VM Stack)虚拟机栈描述的是Java方法执行的内存模型,每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。 本地方法栈(Native Method Stack)本地方法栈用于支持本地方法(native标识的方法,即非Java语言实现的方法)。   虚拟机栈和本地方法栈,当线程请求分配的栈容量超过JVM允许的最大容量时抛出StackOverflowError异常。 线程不共享区域如下图...
Hello World
发表于2024-12-15|教程
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub. Quick StartCreate a new post$ hexo new "My New Post" More info: Writing Run server$ hexo server More info: Server Generate static files$ hexo generate More info: Generating Deploy to remote sites$ hexo deploy More info: Deployment
1…3536
avatar
2025
文章
360
标签
49
分类
10
公告
🌸 春去秋来,花开花落 📚 桌上的日历又薄了几页 💭 记忆中的昨天还那么清晰
最新文章
掌握 Spring 框架这 10 个扩展点,开发效率直接翻倍2025-11-10
Minikube安装教程2025-11-07
Deepseek 本地部署各个版本超级详细教学,网页版、软件版2025-11-04
Slow HTTP POST 慢速攻击2025-10-30
JDK 紧急漏洞,XMLDecoder反序列化攻击2025-10-30
分类
  • 其他3
  • 区块链4
  • 后端225
  • 安全漏洞3
  • 工具30
  • 性能4
  • 教程1
  • 数据库21
  • 架构15
  • 程序人生54
标签
文章LinuxJVM分布式技术其他区块链基础安全漏洞多线程性能优化新特性架构算法程序人生行业动态规范资料集合进阶面试Elastic JobdockerJWTDubboMyBatisNettyShiroSpringSpring MVCSpring CloudTomcatSpring BootZookeeper日志开源综合技术消息队列缓存连接池Eclipse
归档
  • 2025年11月 3
  • 2025年10月 355
  • 2025年09月 1
  • 2024年12月 1
网站信息
文章数目 :
360
本站访客数 :
本站总浏览量 :
最后更新时间 :
访客地图
© 2025 By 2025
搜索
数据加载中