初识线程

简介: 在 Java 多线程编程中,线程对象名与线程名称是两个不同概念。对象名是代码中引用线程对象的变量名,如 `t1`,而线程名称是线程实例在 JVM 中的标识,可通过 `setName()` 或构造函数设置。若不显式设置,Java 会分配默认名称如 `Thread-0`。通过 `Thread.currentThread().getName()` 可获取当前执行线程的名称。

线程对象名不是线程的名字

setName()常用设置线程名称

java

DrawMoneryThread t1 = new DrawMoneryThread(b1, a1, 100000);


这里的t1只是 Java 程序中对线程对象的引用变量名,用于在代码中访问该线程对象。而线程的名称是线程对象内部的一个属性,用于标识线程在 JVM 中的运行实例。


当你在线程内部调用:


java

Thread.currentThread().getName();


这行代码返回的是当前正在执行的线程实例的名称,而不是你定义的引用变量名t1

线程名称的默认规则

如果你不显式设置线程名称,Java 会为每个线程分配一个默认名称,格式通常为:


  • Thread-0Thread-1Thread-2 等(对于直接继承Thread类的线程)
  • 或者根据线程池或执行器的命名规则生成

显式设置线程名称

有两种常见方法可以为线程设置自定义名称:

方法 1:通过Thread构造函数设置(适用于继承Thread类的方式)

java

public class DrawMoneryThread extends Thread {
    public DrawMoneryThread(String name) {
        super(name); // 调用父类Thread的构造函数设置名称
    }
    
    @Override
    public void run() {
        System.out.println("当前线程名称: " + Thread.currentThread().getName());
    }
}
// 创建线程时指定名称
DrawMoneryThread t1 = new DrawMoneryThread("取款线程-1");
t1.start();

方法 2:通过setName()方法设置(适用于实现Runnable接口的方式)

java

public class DrawMoneryThread implements Runnable {
    @Override
    public void run() {
        System.out.println("当前线程名称: " + Thread.currentThread().getName());
    }
}
// 创建线程时设置名称
DrawMoneryThread task = new DrawMoneryThread();
Thread t1 = new Thread(task, "取款线程-1"); // 通过Thread构造函数设置名称
t1.start();
// 或者创建后再设置
Thread t2 = new Thread(task);
t2.setName("取款线程-2");  
t2.start();

可以混用,并不一定继承了thread类的只能用构造器方法,也可以用setname方法

相关文章
|
4月前
|
SQL JavaScript Java
三层架构理解(实现前后端分离)
本文介绍了三层架构实现前后端分离的流程,从前端Vue发起请求,到后端Spring处理数据,最后返回结果并由前端渲染展示。同时详细解析了Bean重复问题的解决方案,包括使用@Service、@Primary、@Qualifier和@Resource注解进行依赖注入控制。此外还介绍了MyBatis中#{}与${}的区别及使用场景,以及三层架构中各组件的协作方式。
|
4月前
|
消息中间件 网络性能优化
了解MQ
消息堆积处理核心在于平衡生产与消费速度,可通过限流生产、优化消费者处理能力及异步机制缓解。RabbitMQ通过持久化、确认机制保障消息可靠性,MQTT则依赖QoS等级确保传输。延迟消息常用死信队列实现,而幂等性可通过唯一ID避免重复消费。MQ广泛用于异步处理、系统解耦及分布式事务等场景。
|
4月前
|
存储 前端开发 JavaScript
初始前端3
本文介绍了前端开发中的表单交互设计与数据绑定技巧,包括按钮点击事件处理、表单模型与实例的创建及使用、单向与双向数据绑定的区别与应用,以及表格数据展示等内容,适用于 Vue 框架下的 Element UI 组件实践。
|
4月前
|
存储 JavaScript 前端开发
初始前端1
本文介绍了 Vue 组合式开发中使用 `ref` 实现响应式数据的方法,强调不依赖 `this`。内容包括创建 `.vue` 文件的模板结构、使用 `ref` 定义响应式变量(如 `count2.value`)与非响应式变量(如 `count3`)的区别,以及如何在模板中绑定数据。同时通过表格对比了 `ref` 在 JavaScript 和模板中的使用方式,指出在 JS 中需用 `.value` 操作数据,而在模板中可直接访问。最后以生活化的类比解释 `ref` 的作用,帮助开发者更好地理解响应式原理。
|
4月前
|
存储 JSON 前端开发
初始前端2
本文介绍了前端开发中的几个关键技术点,包括使用`layout->router->view`结构实现页面渲染、利用`ref`定义动态响应模型、通过`axios`及`el-upload`实现文件上传、以及使用`localStorage`进行数据持久化存储等内容。重点解析了各组件间的数据传递、异步请求处理、前后端数据格式适配及数据序列化/反序列化操作,帮助开发者更好地理解前后端交互及组件协作机制。
|
4月前
|
SQL C++
sql了解1
本文介绍了SQL中主键自增的特性,删除记录后自增序号的处理方式,以及DML操作(插入、更新、删除)的基本语法和示例。同时区分了DML与DQL的不同用途,并通过代码示例展示了如何正确使用`SELECT`语句查询数据。
|
4月前
|
存储 安全 测试技术
Python面试题精选及解析
本文详解Python面试中的六大道经典问题,涵盖列表与元组区别、深浅拷贝、`__new__`与`__init__`、GIL影响、协程原理及可变与不可变类型,助你提升逻辑思维与问题解决能力,全面备战Python技术面试。
168 0
|
4月前
|
传感器 机器人 物联网
【免费开源】基于STM32的蓝牙小车/智能小车项目详解(附源码)
通过本项目,你可以系统掌握STM32外设控制、蓝牙通信、电机驱动和传感器数据处理技术,实现一辆可远程控制并具备避障功能的智能小车。该项目具有高度可扩展性,后续可增加循迹、自动寻路、摄像头等高级功能。
903 42
【免费开源】基于STM32的蓝牙小车/智能小车项目详解(附源码)
|
7月前
|
设计模式 SQL 安全
并发设计模式实战系列(13):双重检查锁定(Double-Checked Locking)
🌟 大家好,我是摘星!🌟今天为大家带来的是并发设计模式实战系列,第十三章,废话不多说直接开始~
404 0
|
4月前
|
Ubuntu 关系型数据库 MySQL
Ubuntu 22.04.1上安装MySQL 8.0及设置root密码的注意事项
这些是在Ubuntu 22.04.1 系统上安装MySQL 8.0 及设置root密码过程中必须考虑的关键点。正确的遵循这些步骤可确保MySQL的安装过程既顺利又安全。
839 20