JAVA创建线程的两种方法

news/2025/3/16 3:13:27/

Java创建线程的方法有两种

两种方法分别是继承Thread类和实现Runnable接口。

  1. 继承Thread类
class MyThread extends Thread {@Overridepublic void run() {System.out.println("Hello World!");}
}public class Main {public static void main(String[] args) {MyThread myThread = new MyThread();myThread.start();}
}
  1. 实现Runnable接口
class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("Hello World!");}
}public class Main {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();Thread thread = new Thread(myRunnable);thread.start();}
}

两者区别在于,通过继承Thread类,可以重写Thread类中的run()方法,直接调用start()方法启动线程;而通过实现Runnable接口,需要先创建一个实现了Runnable接口的类的实例对象,在创建Thread对象时将该实例对象作为参数传入,并且该实现类必须实现run()方法。由于Java只支持单继承,因此如果已经继承了其他类,则无法使用第一种方法创建线程。

Java引入线程组

为了更好地管理和控制线程。通过将线程分组,可以更轻松地对线程进行统一管理和控制,例如一次性停止所有属于同一线程组的线程等。此外,在开发中,有时需要创建大量的线程,而这些线程可能是相关的,因此通过将它们放入同一个线程组中,可以更清晰地表达它们之间的关系。最后,线程组还可以用于安全管理,因为可以为不同的线程组设置不同的安全策略,以确保线程安全执行。
下面是一个简单的JAVA线程组应用示例:

public class ThreadGroupDemo {public static void main(String[] args) {ThreadGroup group = new ThreadGroup("testGroup"); // 创建一个名为testGroup的线程组Thread t1 = new Thread(group, new MyRunnable(), "t1");Thread t2 = new Thread(group, new MyRunnable(), "t2");Thread t3 = new Thread(group, new MyRunnable(), "t3");t1.start();t2.start();t3.start();System.out.println("Active threads in thread group: " + group.activeCount());group.list();}static class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " is running.");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

在这个示例中,我们创建了一个名为“testGroup”的线程组,并向其中添加了三个线程。通过调用activeCount()方法,可以获取线程组当前活动的线程数量。通过调用list()方法,可以输出线程组中所有线程的相关信息。

输出结果如下:

t1 is running.
t3 is running.
t2 is running.
Active threads in thread group: 3
java.lang.ThreadGroup[name=testGroup,maxpri=10]Thread[t1,5,testGroup]Thread[t3,5,testGroup]Thread[t2,5,testGroup]

可以看到,我们创建的线程组包含了三个线程,它们都在运行中。通过list()方法,我们可以查看线程组中包含了哪些线程,并了解每个线程的相关信息。

需要注意的是,线程组并不会影响线程本身的执行,它只是一个逻辑上的分组并提供一些管理和控制的功能。


http://www.ppmy.cn/news/92819.html

相关文章

SQLite 数据库入门教程(GO)

文章目录 SQLite数据库入门教程一、SQLite 简介1、什么是 SQLite?2、为什么要用 SQLite? 二、SQLite 安装1、在 Windows 上安装 SQLite2、在 Linux 、Mac OS上安装 SQLite 三、SQLite 命令四、SQLite 使用1、SQLite 数据类型2、SQLite 语法3、SQLite 可视…

Unity随机寻路

当今的游戏设计行业越来越注重游戏的可玩性和交互性,而游戏中的角色寻路是其中一项重要的技术挑战。本篇博客将深入探讨如何使用Unity中的NavMesh和代码实现让角色在一个区域内随机寻路的功能。下面先给出代码实现,随后对代码进行注释和详细解释。 usin…

ASP.NET 未能找到类型或命名空间名称“HttpRequestMessage”

引入System.Net.Http后,运行页面还是报错 using System.Net.Http;chatGPT解释需要安装Microsoft.AspNet.WebApi.Client包,IIS安装的包文件存储在bin目录下,安装包后bin目录多出了一些列文件 运行页面后还是报错 需要在web.config配置文件…

LeetCode 不同路径1\2

不同路径1和2 题目在上面 这两个题目都是简单的动态规划问题 对不同路径最初始的问题举个例子 因为我们的机器人只能向右或者向下走一步 因此这个矩形的第一行和第一列都可以初始化为1 然后我们就可以得到动态规划的方程 f i , j f i − 1 , j f i , j − 1 f_{i,j} f_{i…

Spring Boot 单元测试

文章目录 一,Spring Boot单元测试概述二,对项目HelloWorld01进行单元测试1、添加测试依赖启动器和单元测试2、创建测试类与测试方法 三,对项目HelloWorld02进行单元测试1、添加单元测试依赖2、进行单元测试 一,Spring Boot单元测试…

数的范围问题

给定一个按照升序排列的长度为 n的整数数组,以及 q 个查询。 对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 00 开始计数)。 如果数组中不存在该元素,则返回 -1 -1。 输入格式 第一行包含整数 n 和 q&…

JSP学生学籍管理系统设计与实现(源代码+论文+开题报告+外文翻译+答辩PPT)

随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。管理信息系统是一个不断发展的新型学科,任何一个单位要生存要发展,要高效率地把内部活动有机地组织起来,就必须建立与自身特点相适应的管理信息系统。 本文采用JSP和MS SQL-Server等软…

逆序对的数量

给定一个长度为 n的整数数列&#xff0c;请你计算数列中的逆序对的数量。 逆序对的定义如下&#xff1a;对于数列的第 i 个和第 j 个元素&#xff0c;如果满足 i<j 且 a[i]>a[j]&#xff0c;则其为一个逆序对&#xff1b;否则不是。 输入格式 第一行包含整数 n &#…