java编程思想读书笔记----线程组的控制

ROS2通过ros2_socketcan实现CAN总线高效数据过滤与多节点通信 本文详细解析了ROS2通过ros2_socketcan实现CAN总线高效数据过滤与多节点通信的技术方案。文章重点探讨了CanFilterList的工作原理、多过滤器组合使用及动态配置策略,有效解决了工业应用中CAN总线数据过载问题,显著降低了CPU负载并提升了系统实时性。 阅读详情
线程组的控制
抛开安全问题不谈,线程组最有用的一个地方就是控制:只需用单个命令即可完成对整个线程组的操作。下
面这个例子演示了这一点,并对线程组内优先级的限制进行了说明。括号内的注释数字便于大家比较输出结
果:
//: ThreadGroup1.java
// How thread groups control priorities
// of the threads inside them.
public class ThreadGroup1 {
public static void main(String[] args) {
// Get the system thread & print its Info:
ThreadGroup sys =
Thread.currentThread().getThreadGroup();
sys.list(); // (1)
// Reduce the system thread group priority:
sys.setMaxPriority(Thread.MAX_PRIORITY - 1);
// Increase the main thread priority:
Thread curr = Thread.currentThread();
curr.setPriority(curr.getPriority() + 1);
sys.list(); // (2)
// Attempt to set a new group to the max:
ThreadGroup g1 = new ThreadGroup("g1");
g1.setMaxPriority(Thread.MAX_PRIORITY);
// Attempt to set a new thread to the max:
Thread t = new Thread(g1, "A");
t.setPriority(Thread.MAX_PRIORITY);
g1.list(); // (3)
// Reduce g1's max priority, then attempt
// to increase it:
g1.setMaxPriority(Thread.MAX_PRIORITY - 2);
g1.setMaxPriority(Thread.MAX_PRIORITY);
g1.list(); // (4)
// Attempt to set a new thread to the max:
t = new Thread(g1, "B");
t.setPriority(Thread.MAX_PRIORITY);
g1.list(); // (5)
// Lower the max priority below the default
// thread priority:
g1.setMaxPriority(Thread.MIN_PRIORITY + 2);
// Look at a new thread's priority before
// and after changing it:
t = new Thread(g1, "C");
g1.list(); // (6)
t.setPriority(t.getPriority() -1);
g1.list(); // (7)
// Make g2 a child Threadgroup of g1 and
// try to increase its priority:
ThreadGroup g2 = new ThreadGroup(g1, "g2");
g2.list(); // (8)
g2.setMaxPriority(Thread.MAX_PRIORITY);
528
g2.list(); // (9)
// Add a bunch of new threads to g2:
for (int i = 0; i < 5; i++)
new Thread(g2, Integer.toString(i));
// Show information about all threadgroups
// and threads:
sys.list(); // (10)
System.out.println("Starting all threads:");
Thread[] all = new Thread[sys.activeCount()];
sys.enumerate(all);
for(int i = 0; i < all.length; i++)
if(!all[i].isAlive())
all[i].start();
// Suspends & Stops all threads in
// this group and its subgroups:
System.out.println("All threads started");
sys.suspend(); // Deprecated in Java 1.2
// Never gets here...
System.out.println("All threads suspended");
sys.stop(); // Deprecated in Java 1.2
System.out.println("All threads stopped");
}
} ///:~
下面的输出结果已进行了适当的编辑,以便用一页能够装下(java.lang.已被删去),而且添加了适当的数
字,与前面程序列表中括号里的数字对应:
(1) ThreadGroup[name=system,maxpri=10]
Thread[main,5,system]
(2) ThreadGroup[name=system,maxpri=9]
Thread[main,6,system]
(3) ThreadGroup[name=g1,maxpri=9]
Thread[A,9,g1]
(4) ThreadGroup[name=g1,maxpri=8]
Thread[A,9,g1]
(5) ThreadGroup[name=g1,maxpri=8]
Thread[A,9,g1]
Thread[B,8,g1]
(6) ThreadGroup[name=g1,maxpri=3]
Thread[A,9,g1]
Thread[B,8,g1]
Thread[C,6,g1]
(7) ThreadGroup[name=g1,maxpri=3]
Thread[A,9,g1]
Thread[B,8,g1]
Thread[C,3,g1]
(8) ThreadGroup[name=g2,maxpri=3]
(9) ThreadGroup[name=g2,maxpri=3]
(10)ThreadGroup[name=system,maxpri=9]
Thread[main,6,system]
ThreadGroup[name=g1,maxpri=3]
Thread[A,9,g1]
529
Thread[B,8,g1]
Thread[C,3,g1]
ThreadGroup[name=g2,maxpri=3]
Thread[0,6,g2]
Thread[1,6,g2]
Thread[2,6,g2]
Thread[3,6,g2]
Thread[4,6,g2]
Starting all threads:
All threads started
所有程序都至少有一个线程在运行,而且main()采取的第一项行动便是调用Thread 的一个static(静态)
方法,名为currentThread()。从这个线程开始,线程组将被创建,而且会为结果调用list()。输出如下:
(1) ThreadGroup[name=system,maxpri=10]
Thread[main,5,system]
我们可以看到,主线程组的名字是system,而主线程的名字是main,而且它从属于system 线程组。
第二个练习显示出system 组的最高优先级可以减少,而且main 线程可以增大自己的优先级:
(2) ThreadGroup[name=system,maxpri=9]
Thread[main,6,system]
第三个练习创建一个新的线程组,名为g1;它自动从属于system 线程组,因为并没有明确指定它的归属关
系。我们在g1 内部放置了一个新线程,名为A。随后,我们试着将这个组的最大优先级设到最高的级别,并
将A 的优先级也设到最高一级。结果如下:
(3) ThreadGroup[name=g1,maxpri=9]
Thread[A,9,g1]
可以看出,不可能将线程组的最大优先级设为高于它的父线程组。
第四个练习将g1 的最大优先级降低两级,然后试着把它升至Thread.MAX_PRIORITY。结果如下:
(4) ThreadGroup[name=g1,maxpri=8]
Thread[A,9,g1]
同样可以看出,提高最大优先级的企图是失败的。我们只能降低一个线程组的最大优先级,而不能提高它。
此外,注意线程A 的优先级并未改变,而且它现在高于线程组的最大优先级。也就是说,线程组最大优先级
的变化并不能对现有线程造成影响。
第五个练习试着将一个新线程设为最大优先级。如下所示:
(5) ThreadGroup[name=g1,maxpri=8]
Thread[A,9,g1]
Thread[B,8,g1]
因此,新线程不能变到比最大线程组优先级还要高的一级。
这个程序的默认线程优先级是6;若新建一个线程,那就是它的默认优先级,而且不会发生变化,除非对优
先级进行了特别的处理。练习六将把线程组的最大优先级降至默认线程优先级以下,看看在这种情况下新建
一个线程会发生什么事情:
(6) ThreadGroup[name=g1,maxpri=3]
Thread[A,9,g1]
530
Thread[B,8,g1]
Thread[C,6,g1]
尽管线程组现在的最大优先级是3,但仍然用默认优先级6 来创建新线程。所以,线程组的最大优先级不会
影响默认优先级(事实上,似乎没有办法可以设置新线程的默认优先级)。
改变了优先级后,接下来试试将其降低一级,结果如下:
(7) ThreadGroup[name=g1,maxpri=3]
Thread[A,9,g1]
Thread[B,8,g1]
Thread[C,3,g1]
因此,只有在试图改变优先级的时候,才会强迫遵守线程组最大优先级的限制。
我们在(8)和(9)中进行了类似的试验。在这里,我们创建了一个新的线程组,名为g2,将其作为g1 的一个
子组,并改变了它的最大优先级。大家可以看到,g2 的优先级无论如何都不可能高于g1:
(8) ThreadGroup[name=g2,maxpri=3]
(9) ThreadGroup[name=g2,maxpri=3]
也要注意在g2 创建的时候,它会被自动设为g1 的线程组最大优先级。
经过所有这些实验以后,整个线程组和线程系统都会被打印出来,如下所示:
(10)ThreadGroup[name=system,maxpri=9]
Thread[main,6,system]
ThreadGroup[name=g1,maxpri=3]
Thread[A,9,g1]
Thread[B,8,g1]
Thread[C,3,g1]
ThreadGroup[name=g2,maxpri=3]
Thread[0,6,g2]
Thread[1,6,g2]
Thread[2,6,g2]
Thread[3,6,g2]
Thread[4,6,g2]
所以由线程组的规则所限,一个子组的最大优先级在任何时候都只能低于或等于它的父组的最大优先级。
本程序的最后一个部分演示了用于整组线程的方法。程序首先遍历整个线程树,并启动每一个尚未启动的线
程。例如,system 组随后会被挂起(暂停),最后被中止(尽管用suspend()和stop()对整个线程组进行操
作看起来似乎很有趣,但应注意这些方法在Java 1.2 里都是被“反对”的)。但在挂起system 组的同时,
也挂起了main 线程,而且整个程序都会关闭。所以永远不会达到让线程中止的那一步。实际上,假如真的中
止了main 线程,它会“掷”出一个ThreadDeath 违例,所以我们通常不这样做。由于ThreadGroup 是从
Object 继承的,其中包含了wait()方法,所以也能调用wait(秒数×1000),令程序暂停运行任意秒数的时
间。当然,事前必须在一个同步块里取得对象锁。
ThreadGroup 类也提供了suspend()和resume()方法,所以能中止和启动整个线程组和它的所有线程,也能
中止和启动它的子组,所有这些只需一个命令即可(再次提醒,suspend()和resume()都是Java 1.2 所“反
对”的)。
从表面看,线程组似乎有些让人摸不着头脑,但请注意我们很少需要直接使用它们。
实战指南 | Adjust 与 Facebook、Google Ads 自归因配置全流程解析 本文详细解析了Adjust与Facebook、Google Ads自归因配置的全流程,帮助移动应用出海推广者解决广告归因难题。通过自归因功能(SAN),开发者可以获取更准确的数据、简化配置流程并扩大安装来源覆盖,显著提升广告效果监测和ROI计算效率。 阅读详情

相关推荐

Ubuntu更新后VirtualBox报错rc=-1908?手把手教你修复Kernel driver not installed

本文详细解析了Ubuntu更新后VirtualBox报错rc=-1908的原因,并提供了完整的修复方案。通过重新安装VirtualBox、处理DKMS内核模块以及解决Secure Boot问题,帮助用户快速恢复虚拟机功能。特别针对Kernel driver not installed错误,给出了从诊断到修复的详细步骤。

weixin_42519781的博客 340

多线程 —— 线程组的概念,实现多个线程一起管理

代码:public class MyRunnale implements Runnable{ @Override public void run() { for (int x=0;x<100;x++){ System.out.println(Thread.currentThread().getName() + ":" + x);

李威威的博客 2362

【各种轮子2】基于Icepak的PCB散热仿真比较

随着电子产品的集成度越来越高,PCB板的尺寸越来越小,板级芯片散热的问题越来越成为电子工程师的一个重要挑战。对于板级芯片散热,主要依靠工程师对PCB自身的设计进行优化,同时要兼顾系统的尺寸和成本。本文分别从芯片角度和PCB角度进行建模,芯片模型选用QFN封装,PCB模型采用走线导入模型,探讨了芯片结构,PCB铜厚,PCB叠层厚度对芯片散热的影响。

3670

多线程-6-线程组与异常

Java使用ThreadGroup表示线程组,可以对一批线程进行分类管理,Java允许程序直接对线程组控制。对线程组的

呵呵。。。 910

CTFmisc-------Jack

每一个文件里面都有不一样的base64编码,我尝试将其解密,发现解出来的是乱码,所以我想到真正的flag藏在这些字符串中,所以我们要写代码把字符串提取出来。提取出来后,得到很多的base64的编码,要一个一个的解码很麻烦,猜到里面有flag字样的base64编码,所以我们将flag进行base64编码,1.下载得到Jack文件夹,里面有很多的txt文件。发现这个字符串是众多编码中唯一一个没有==然后从那些base编码中寻找Zmxh字段。

woshicainiao666的博客 1万+

扬声器设计避坑指南:用Comsol分析反电动势对THD的影响(附案例文件)

本文深入探讨了扬声器设计中反电动势对总谐波失真的关键影响。通过COMSOL仿真,详细分析了BL值非线性、音圈电感变化等电磁-力-声耦合机制,并提供了从参数化建模到系统级优化的实战指南,帮助工程师精准量化并降低谐波失真,提升扬声器音质。

xx56789的博客 522

Java编程思想读书笔记(八)第21章-并发

线程可以驱动任务,因此你需要一种描述任务的方式,这可以由Runnable接口来提供。要想定义任务,只需实现Runnable接口并编写run()方法,使得该任务可以执行你的命令。当从Runnable导出一个类时,它必须具有run()方法,但是这个方法并无特殊之处——它不会产生任何内在的线程能力。要实现线程行为,你必须显式地将一个任务附着到线程上。线程的一个额外好处是它们提供了轻量级的执行上下文切换(大约100条指令),而不是重量级的进程上下文切换(要上千条指令)。

leonliu06的博客 2889

地震勘探中的频谱分析:从基础到应用

本文深入探讨了地震勘探中的频谱分析技术,从基础原理到实际应用。通过傅里叶变换等工具,频谱分析能有效识别不同地震波的频率特征,指导数据采集和处理。文章结合油田勘探案例,展示了如何利用振幅谱和相位谱提升信噪比,并介绍了智能滤波等前沿技术在地震数据处理中的应用。

weixin_42557830的博客 406

JAVA编程思想读书笔记(五)--多线程

接上篇JAVA编程思想读书笔记(四)--对象的克隆 No1: daemon Thread(守护线程) 参考http://blog.youkuaiyun.com/pony_maggie/article/details/42441895 daemon是相于user线程而言的,可以理解为一种运行在后台的服务线程,比如时钟处理线程、idle线程、垃圾回收线程等都是daemon线程。 daemon线程有个特点...

weixin_30369041的博客 92

《AgentScope-Java 深入浅出教程》第10章 RAG 知识检索

RAG(Retrieval-Augmented Generation,检索增强生成)是一种将信息检索与文本生成相结合的技术架构。它通过从外部知识库中检索相关文档,将检索到的信息作为上下文注入到语言模型的提示中,从而增强模型的回答质量。│ RAG 工作流程 ││ ││ 用户问题 向量检索 上下文增强 生成回答 ││ ▼ ││ │ A │ ││ ││ 1. 接收问题 ││ 2. 将问题转换为向量,在知识库中检索相似文档 ││ 3. 将检索到的文档作为上下文添加到提示词中 │。

步子哥的博客 462

一个 ABAP 工具,能打印系统里某个用户对 BSP 应用的浏览历史记录

只要一个用户在 SAP ABAP 系统里浏览过 BSP 页面,会留下浏览历史记录。本工具会解析出这些记录,打印出该用户浏览的历史事件,和浏览过的页面名称。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 546

Java基础读书笔记(十一)——多线程

多线程 多线程就是同时存在N个执行体,按几条不同的执行线索共同工作的情况。 1. 线程 线程是可由系统调度的一个最简单的代码单元,负责执行包含在进程的地址空间中的程序代码。 Java语言中提供了一个垃圾收集线程,自动回收动态分配的内存 多线程和多进程的本质区别在于每个进程有它自己的变量的完备集,线程则共享相同的数据。 - 用多线程技术的主要原因: (1)可以编写一个交互程序。...

YOLO97的博客 434

AI智算-K8s+vLLM & Ray:DeepSeek-r1 671B 满血版分布式推理部署实践

自从上次发布 【AI-智算】K8s+SGLang实战:DeepSeek-r1:671b满血版多机多卡私有化部署全攻略] 文章后,本次将演示另一个主流推理引擎工具——vLLM,结合K8s、LWS、Ray、Volcano等技术栈,部署DeepSeek-r1 671b 满血版分布式推理集群,并对比其与SGLang推理引擎的性能表现。

Kason_iWiki 1826

读书笔记之LoadRunner性能测试巧匠训练营(四)

《LoadRunner性能测试巧匠训练营》第5章 开源性能测试工具Apache Jmeter快速入门 1.Apache Jmeter概述 1.1 官方介绍: Apache JMeter是一个100%的纯Java桌面应用,用于压力测试和性能测试。它最初被设计用于Web应用测试,但后来扩展到其他测试领域。Apache JMeter可以用于对静态的和动态的资源(文件、Servlet、Web动态语...

毛依依的博客 328

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java编程思想读书笔记二十一 并发一

基本的线程机制 定义一个任务 术语 绑定任务到线程 Executor接口 从任务中产生返回值 sleep 在main线程中,是无法捕捉到其它线程抛出的异常的,这些异常会被直接打印在控制台。 优先级 yield 让步 后台(daemon)线程 线程工厂 join ...

哪有什么天生王者,不过是一步一个脚印 198

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

JAVA高并发编程--第二章读书笔记

新建线程的两种方法 继承Thread类并重写run()方法(一般采用匿名内部类) class ThreadTest extends Thread{ //若用run方法而非start方法开启新线程,他只会在当前线程调用run方法,而不会开启新//线程。 @Override public void run() { for (int i=1;i<10;i++){ System.out.println(Thread.currentThread()...

a219219219219的博客 255

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

《Effective Java》读书笔记三

五十一 当心字符串连接的性能 1、为连接n个字符串而重复使用字符串连接符+,需要n的平方级的时间。这是由于字符串不可变而导致的结果。当两个字符串被连接在一起时,它们的内容都要被拷贝。 2、如果项目数量巨大,为了获取可以接受的新能,请使用StringBuilder替代String StringBuilder类(非同步),已经替代了同步的StringBuffer类。 3、不要使用字符串连接符来

Snowball 1727

Effective Java读书笔记一:并发

第66条:同步访问共享的可变数据 关键字synchronized可以保证在同一时刻,只有一个线程可以执行某一个方法,或者某一个代码块。 同步不仅可以阻止一个线程看到对象处于不一致的状态中,它还可以保证进入同步方法或者同步代码块的每个线程,都看到同一个锁保护的之前的修改效果。 Volatile 变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前

GarfieldEr007的专栏 1087

【读书笔记】《Effective Java》——目录

第三版英文版已经出了。。。 看来要一边整理第二版,一边读第三版了。 第二章——创建和销毁对象 第1条:考虑用静态工厂方法替代构造器 第2条:遇到多个构造器参数时要考虑用构建器 第3条:用私有构造器或者枚举类型强化Singleton属性 第4条:通过私有构造器强化不可实例化的能力 第5条:避免创建不必要的对象 第6条:消除过期的对象引用 第7条:避免使用终结方法 第...

a61140502935的博客 208

think in java第十四章关于多线程的读书笔记

      书的这一章主要讨论的是多线程的使用以及关于多线程中访问共享数据中遇到的问题。首先总结一下多线程的使用方法。方法有2种,第一种是直接继承 Thread类,然后在public void run()写入需要用在线程的代码。作完以后只需要调用start()方法,就会开始新开一个线程并执行run()中的代码了。另外一种方法是使用 runnable接口,同样需要使用线程的代码写入run()方法中,

dksokil的专栏 904

《Effective Java》读书笔记

《Effective Java》提纲: 第一条:考虑用静态工厂代替构造器; 第二条:遇到多个构造器参数时要考虑使用构建器; 第三条:用私有构造器或枚举类型强化Singleton(单例)属性; 第四条:通过私有构造器强化不可实例化的能力; 第五条:避免创建不必要的对象; 1、使用基本...

chenqiang8644的博客 157

effective java 读书笔记

  第一章 引言 全书78条原则,大致包含了并发,设计模式,多态,类库,异常,序列化等相关知识,从安全,高效,性能,扩展,可读性,这几个方面讲述了 How to use Java efficiently ? 事例源码:点击打开 看完之后觉得自己之前的编码水平太low了,写代码没有章法,没有套路,不易维护,隐藏着很多问题   第2章 创建和销毁对象 第1条:考虑用静态工厂方法代替构造器...

左耳听风的博客 324

《Java多线程编程核心技术》读书笔记

为什么80%的码农都做不了架构师?>>> ...

weixin_34235371的博客 85

Effective Java 读书笔记(九):并发

同步访问共享的可变数据 避免过度同步 使用线程池管理线程不要手动 new 线程 并发工具优先于 wait 和 notify 线程安全性的文档化 慎用延迟初始化 不要依赖于线程调度器 避免使用线程组 ThreadGroup

albon arith 538

Java疯狂讲义读书笔记第十六章

线程、线程同步、线程通信、线程池、线程组和异常。有点乱,例子还少。。

bigcupwater的博客 399

读书笔记effective java 之条目

[color=green] 最近看了下effective java 有编程许多经验值得学习,将一些重要的条目列出来 创建和销毁对象 考虑用静态工厂方法代替构造器 遇到多个构造器参数时要考虑用构造器 用私有构造器或者枚举类型强化singleton属性 通过私有构造器强化不可实例化的能力 避免创建不必要的对象 ...

西瓜太甜 155
上一篇: 永远不要在Java中使用String(至少也尽量少用)
下一篇: java编程思想读书笔记---1 4 . 4 . 1 线程组
javaPie
博客等级 码龄16年 1171粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值