文档章节

Java多线程可以分组,还能这样玩!

Java技术栈
 Java技术栈
发布于 2018/11/09 08:54
字数 752
阅读 49
收藏 2

前面的文章,栈长和大家分享过多线程创建的3种方式《实现 Java 多线程的 3 种方式》。

但如果线程很多的情况下,你知道如何对它们进行分组吗?

和 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.lang.ThreadGroup#list()

我们来简单使用下线程组吧!

/**
 * 公众号:Java技术栈
 */
public static void main(String[] args) {
	Runnable runnable = () -> {
		System.out.println("Java技术栈线程线程组名称:" + Thread.currentThread().getThreadGroup());
		System.out.println("Java技术栈线程线程名称:" + Thread.currentThread().getName());
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	};

	ThreadGroup userGroup = new ThreadGroup("user");
    userGroup.setMaxPriority(Thread.MIN_PRIORITY);
    
	Thread userTask1 = new Thread(userGroup, runnable, "user-task1");
	Thread userTask2 = new Thread(userGroup, runnable, "user-task2");

	userTask1.start();
	userTask2.start();

	System.out.println("Java技术栈线程线程组活跃线程数:" + userGroup.activeCount());
	userGroup.list();

}

程序输出以下结果。

Java技术栈线程线程组名称:java.lang.ThreadGroup[name=user,maxpri=1]
Java技术栈线程线程名称:user-task1
Java技术栈线程线程组活跃线程数:2
Java技术栈线程线程组名称:java.lang.ThreadGroup[name=user,maxpri=1]
Java技术栈线程线程名称:user-task2
java.lang.ThreadGroup[name=user,maxpri=1]
    Thread[user-task1,1,user]
    Thread[user-task2,1,user]

根据示例代码和程序输出结果应该对线程组有了一个大概的了解吧。

线程组还能统一设置组内所有线程的最高优先级,线程单独设置的优先级不会高于线程组设置的最大优先级。

另外,线程组中有一个 stop 方法用来终止组内所有的线程,但这个方法和 Thread 中的 stop 方法一样会带来很多问题,所以它们两个现在都已经被废弃了,官方也是不建议使用了,建议使用线程中断功能进行优雅终止线程。


更多 Java 多线程技术文章请在公众号后台回复关键字:多线程。

本文原创首发于公众号:Java技术栈(id:javastack),关注公众号在后台回复 "java" 可获取更多,转载请原样保留本信息。

© 著作权归作者所有

Java技术栈
粉丝 179
博文 172
码字总数 150861
作品 0
深圳
架构师
私信 提问
多线程 start 和 run 方法到底有什么区别?

昨天栈长介绍了《Java多线程可以分组,还能这样玩!》线程分组的妙用。今天,栈长会详细介绍 Java 中的多线程 start() 和 run() 两个方法,Java 老司机请跳过,新手或者对这两个不是很理解的...

Java技术栈
2018/11/13
121
0
ansatsing/QQLandlords

为什么要搞这样一个项目 满足自己的java网络多线程编程的欲望!因为之前一直都是搞web开发,服务器和客户端数据交流人家web服务器早就给你搞好了,比如tomcat,jetty...等等,其实之前脑子里就...

ansatsing
02/15
0
0
15个顶级Java多线程面试题及回答

Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题。在投资银行业务中多...

LCZ777
2014/05/27
500
0
Java多线程学习(五)线程间通信知识点补充

系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Ja...

一只蜗牛呀
2018/04/16
0
0
java基础thread——多线程的纷争(循序渐进)

一、多线程概述 进程: 正在运行的程序,是系统进行资源分配和调用的独立单位。 每一个进程都有它自己的内存空间和系统资源。 多进程有什么意义呢? 单进程的计算机只能做一件事情,而我们现在...

潇潇漓燃
2018/05/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
265
6
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
5
0
Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
8
0
用最通俗的方法讲spring [一] ──── AOP

@[TOC](用最通俗的方法讲spring [一] ──── AOP) 写这个系列的目的(可以跳过不看) 自己写这个系列的目的,是因为自己是个比较笨的人,我曾一度怀疑自己的智商不适合干编程这个行业.因为在我...

小贼贼子
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部