线程的start方法剖析

news2024/11/26 14:41:10

线程的start方法剖析

public synchronized void start() {
    if (threadStatus!=0)
    throw new IllegalThreadStateException();
    group.add(this);
    boolean started = false;
    try {
        start0();
        started = true;
    } finally {
        try {
            if (!started){
                group.threadStartFailed(this);
            }
        } catch (Throwable ignore) {
        }
    }
}
Thread start方法源码总结
public synchronized void start() {
if (threadStatus!=0)·Thread被构造后的NEW状态,事实上threadStatus这个内部属性为0
throw new IllegalThreadStateException();·不能两次启动Thread,否则就会出现IllegalThreadStateException异常。

·一个线程生命周期结束,也就是到了TERMINATED状态,再次调用start方法是不允许的,也就是说TERMINATED状态是没有办法回到RUNNABLE/RUNNING状态的。
group.add(this);·线程启动后将会被加入到一个ThreadGroup中,后文中我们将详细介绍ThreadGroup。
boolean started = false;
try {
start0();JDK的官方文档:※ Causes this thread to begin execution; the Java Virtual Machine calls the run method of this thread.
上面这句话的意思是:在开始执行这个线程时,JVM将会调用该线程的run方法,换言之,run方法是被JNI方法start0()调用的。
started = true;
} finally {
try {
if (!started){
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
}
}
}

执行单元

线程的真正的执行逻辑是在run方法中,通常我们会把run方法称为线程的执行单元

模板设计模式在Thread中的应用

其实Thread的run和start就是一个比较典型的模板设计模式,父类编写算法结构代码,子类实现逻辑细节
public class TemplateMethod {
    // 父类编写算法结构代码,
    public final void print(String message) {
        System.out.println("######befor-add-logic##########");
        wrapPrint(message);
        System.out.println("######after-add-logic##########");

    }
    protected void wrapPrint(String message) {
    }

    public static void main(String[] args) {

        // 子类实现逻辑细节
        TemplateMethod t1 = new TemplateMethod(){
            @Override
            protected void wrapPrint(String message) {
                System.out.println("*"+message+"*");
            }
        };
        t1.print("Hello Thread");
    }
}

策略模式在Thread中的应用

无论是Runnable的run方法,还是Thread类本身的run方法,都是想将线程的控制本身业务逻辑的运行分离开来,达到职责分明、功能单一的原则,这一点与GoF设计模式中的策略设计模式很相似
public interface RowHandler<T> {
    T handle(ResultSet rs);
}

public class RecordQuery {
    private final Connection connection;

    public RecordQuery(Connection connection) {
        this.connection = connection;
    }

    public <T> T query(RowHandler<T> handler, String sql, Object... params) throws SQLException {
        try (PreparedStatement stmt = connection.prepareStatement(sql)) {
            int index = 1;
            for (Object param : params) {
                stmt.setObject(index++, param);
            }
            ResultSet resultSet = stmt.executeQuery();
            return handler.handle(resultSet);//①调用RowHandler
        }
    }
}
上面这段代码的好处是可以用query方法应对任何数据库的查询,返回结果的不同只会因为你传入RowHandler的不同而不同,同样RecordQuery只负责数据的获取,而RowHandler则负责数据的加工,职责分明,每个类均功能单一
相信通过这个简单的示例就类比Thread和Runnable之间的关系。

-----------------------------------------------------------------------------读书笔记摘自书名:Java高并发编程详解:多线程与架构设计 作者:汪文君
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/621384.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

javascript基础三十一:web常见的攻击方式有哪些?如何防御?

一、是什么 Web攻击&#xff08;WebAttack&#xff09;是针对用户上网行为或网站服务器等设备进行攻击的行为 如植入恶意代码&#xff0c;修改网站权限&#xff0c;获取网站用户隐私信息等等 Web应用程序的安全性是任何基于Web业务的重要组成部分 确保Web应用程序安全十分重…

安裝系列 之《Ubuntu 22.04 Mysql 8.0 在线安装和设置静态IP》

为了以后我能直接用&#xff0c;特此记录下来&#xff0c;方便你我他。 开始安装 apt-get update sudo apt install mysql-server -y输入命令&#xff0c;直接安装 输入 mysql --version 就可以看到版本 然后&#xff0c;开始设置默认密码和允许外网访问 sudo mysql -uroot …

异步任务池

Java中的线程池设计得非常巧妙&#xff0c;可以高效并发执行多个任务&#xff0c;但是在某些场景下需要对线程池进行扩展才能更好地服务于系统。例如&#xff0c;如果一个任务仍进线程池之后&#xff0c;运行线程池的程序重启了&#xff0c;那么线程池里的任务就会丢失。另外&a…

Linux 配置系统白名单 gcc/g++

推荐书籍《程序员的自我修养》《深入理解计算机系统》 配置系统白名单 我们在使用普通用户的时候&#xff0c;有些时候需要使用 sudo 指令来对某一条指令直接进行权限提升&#xff0c;因为某一些指令可能因为使用的路径或者其他原因&#xff0c;普通用户没有权限使用这个命令&…

spring boot + minio 分布式文件上传

介绍 1、分布式文件系统 简单理解为&#xff1a;一个计算机无法存储海量的文件&#xff0c;通过网络将若干计算机组织起来共同去存储海量的文件&#xff0c;去接收海量用户的请求&#xff0c;这些组织起来的计算机通过网络进行通信。 好处&#xff1a; 一台计算机的文件系统…

固定风格任意内容的快速风格迁移(讲解网络模型部分)

目录 一、目标&#xff1a;求出一个某种固定风格图像转换网络二、对比一下&#xff1a;v1算法和v2算法的区别在哪里&#xff1f;三、参数四、v2算法的优点五、图像风格转换算法的扩展性六、网络细节&#xff08;该算法的特点&#xff09;七、参考资料 下面我们统一把&#xff1…

《计算机网络——自顶向下方法》精炼——4.3.1-4.4.1

学习和研究好比爬梯子,要一步一步地往上爬,企图一脚跨上四五步,平地登天,那就必须会摔跤了。——华罗庚 文章目录 路由器工作原理输入端口概述交换结构概述输出端口何处出现排队路由选择控制平面 网际协议&#xff1a;因特网中的转发和编址数据报格式IP数据报分片 路由器工作原…

29 # node 中的 eventloop

process.cwd cwd&#xff1a;current working directory 表示当前用户的工作目录&#xff08;这个目录可以更改用户自己切换即可&#xff09; 当用户在哪执行 node 命令&#xff0c;就去哪找配置文件 console.log(process.cwd());__dirname&#xff1a;表示当前文件所在的目…

【计算机网络】网络编程套接字(一)

目录 1.预备知识 1.1.理解源IP地址和目的IP地址 1.2.认识端口号 1.2.1.理解"端口号"和"进程ID" 1.2.2.理解源端口号和目的端口号 1.3.认识TCP/UDP协议 1.3.1.TCP协议 1.3.2.UDP协议 1.4.网络字节序 网络字节序和主机字节序的转换 2.socket编程接…

8B/10B编码

8B/10B编码 8B/10B编码介绍实现方式8b/10b编码中的编码表和字节编码RD控制符号 8B/10B编码 介绍 8b/10b编码是将8位符号映射到10位符号&#xff0c;以实现直流平衡&#xff0c;同时提供足够多的状态来实现时钟恢复。这意味着在一个至少20位的字符串中&#xff0c;1和0的计数之…

[论文阅读笔记74]The Power of Scale for Parameter-Efficient Prompt Tuning

1. 基本信息 题目论文作者与单位来源年份The Power of Scale for Parameter-Effificient Prompt TuningBrian Lester等googleConference on Empirical Methods in Natural Language Processing2021 857 Citations 论文链接&#xff1a;https://arxiv.org/abs/2104.08691 论…

配置SSH远程登录和免密登录

上一篇我们已经讲了如何配置修改Linux的主机名和网络设置&#xff0c;这一篇我们来讲一下配置Linux的SSH免密登录。   首先讲一下我们为什么要配置SSH 免密登录&#xff0c;通过VMware Workstation工具操作虚拟机十分不方便&#xff0c;无法复制内容到虚拟机中&#xff0c;也…

Python使用多进程并行加速业务操作 完整代码

Python使用多进程并行加速业务操作 完整代码 需求分析 完整代码 本demo性能分析 Python中单线程、多线程和多进程的效率对比实验 需求分析 最近在对一个数据集进行处理&#xff0c;共2000条&#xff0c;每条去调一个第三方接口&#xff0c;耗时7-10秒。单线程处理一次要3.…

Vue - 项目编译速度、性能优化、打包体积优化

GitHub Demo 地址 在线预览 Vue - 项目编译速度、性能优化、打包体积优化 序一、编译速度优化1、使用缓存1.1、缓存插件 - HardSourceWebpackPlugin1.2、webpack5 配置cache1.3、cache-loader 插件 2、合理使用source-map3、多线程打包3.1、thread-loader3.2、parallel-webpac…

阿里5面,成功唬住面试官拿了21K,面试也没有那么难吧....

阿里的面试挺独特&#xff0c;每轮面试都没有 HR 约时间&#xff0c;一般是晚上 8 点左右面试官来一个电话&#xff0c;问是否能面试&#xff0c;能的话开始面&#xff0c;不能就约一个其它时间。 全程 5 面&#xff0c;前四面技术面&#xff0c;电话面试&#xff0c;最后一面…

吴恩达 ChatGPT Prompt Engineering for Developers 系列课程笔记--08 Chatbot

08 Chatbot ChatGPT的一种重要功能是作为一个聊天机器人&#xff0c;本节将展示如何和ChatGPT进行对话 1) 不同的角色&#xff08;Roles&#xff09; 前面几节的课程中&#xff0c;我们通过如下函数调用ChatGPT的接口&#xff0c;输入用户输入的prompt&#xff0c;返回模型生…

第二章硬件入门之电容

第二章硬件入门之电容 文章目录 第二章硬件入门之电容一、电容是什么&#xff1f;二、实际应用场景常见电容&#xff1a;1.陶瓷电容&#xff08;无正负极之分&#xff09;1、旁路2、去耦 2.铝电解电容贴片式插件式3.安规电容x电容Y电容 总结 一、电容是什么&#xff1f; **电容…

【kernel exploit】CVE-2022-2602 UNIX_GC错误释放io_uring注册的file结构-UAF

本文主要参考 [漏洞分析] CVE-2022-2602 io_uring UAF内核提权详细解析 并做一些补充。 影响版本&#xff1a;Linux Kernel < v6.0.3。v6.0.3已修复。 测试版本&#xff1a;Linux-v6.0.2 &#xff08;v6.0.2 测试失败&#xff0c;v5.18.19测试成功&#xff09; exploit及测…

React Fiber 使用 MessageChannel + requestAnimationFrame 模拟实现 requestIdleCallback

由于 requestIdleCallback 兼容性较差且不支持 Safari&#xff0c;React Fiber 需要实现一个 requestIdleCallback polyfill 做浏览器兼容&#xff1b; MDN RequestIdleCallbackMDN RequestAnimationFrameMDN MessageChannel 以下为其使用 MessageChannel requestAnimationF…

vivado中ila的使用方法记录

ILA工具生成方法 一、 ILA工具介绍 在FPGA的开发中&#xff0c;当完成代码设计后&#xff0c;为了验证代码的准确性和各种不同条件下的可靠性&#xff0c;往往需要优先想到通过逻辑仿真进行相关验证。使用逻辑仿真进行验证虽然可以周密的考虑给出不同输入条件下的输出结果或交…