多线程——创建

news2024/11/15 19:57:23

线程的创建与启动

Java中,所有的线程对象都必须是Thread类或其子类的实例。

三种创建方式:

  1. 集成Thread类创建线程类

    继承Thread类,重写run方法,run方法的方法体代表线程需要完成的任务,称为线程执行体。

    创建子类的实例,即创建了线程对象。

    调用线程对象的start方法就可以启动了该线程。

    class ThreadChild1 extends Thread {
    	@Override
    	public void run() {
    		super.run();
    		//...
    	}
    }
    private static void main(String[] args){
        //启动一个线程
        new ThreadChild1().start();
        //启动第二个线程
        new ThreadChild1().start();
    }
    
  2. 实现Runnable接口创建线程类

    实现Runnable接口,重写run方法,也是线程方法执行体。

    创建实现类的实例,将实例作为参数传到Thread构造函数中,可创建Thread线程对象

    class ThreadChild1 implements Runnable{
    	@Override
    	public void p run() {
    		//...
    	}
    }
    private static void main(String[] args){
        ThreadChild1 threadChild1 = new ThreadChild1();
        //启动一个线程
        new Thread(threadChild1, "first").start();
        //启动第二个线程
        new Thread(threadChild1, "second").start();
    }
    
  3. 使用Callable和Future创建线程

    创建Callable接口的实现类,重写call方法,call方法有返回值,再创建Callable实现类的实例。

    创建FutureTask实例传入Callable对象。

    再将FutureTask实例作为参数传到Thread构造函数中,可创建Thread线程对象。

    通过FutureTask实例对象调用get()方法得到子线程的返回值。

    class ThreadChild1 implements Callable<Integer> {
    	@Override
    	public Integer call() throws Exception {
                //...
    	}
    }
    private static void main(String[] args){
    	ThreadChild1 child1 = new n ThreadChild1();
    	FutureTask<Integer> task = new n FutureTask<>(child1);
        new Thread(task, "有返回值的线程").start();
        //获取子线程的返回值
        try {
       		System.out.println("子线程的返回值: "+futureTask.get());
        } catch (Exception e) {
        	e.printStackTrace();
        }
    }
    

一般推荐实现接口创建多线程,直接继承Thread后,无法再继承其他父类。

线程的生命周期

线程被创建并启动后,会经历五种状态。

新建new->就绪runnable->运行running->阻塞blocked->死亡dead

新建:

XxxThread xx = new XxxThread()

就绪:

调用start后,线程处于就绪状态,此时已经做好了执行的准备,可以运行了,但还没有运行,蓄势待发。

运行:

线程获得调度时,线程处于运行状态,开始执行run方法中的线程执行体。

阻塞:

线程处于活动状态,但是停止运行,没有CPU的使用权。

**1. 等待阻塞:**线程调用wait方法;调用join方法,等待别的线程终止或超时后执行本线程。

**2. 同步阻塞:**线程获取锁失败,会进入同步阻塞状态。

**3. 其他阻塞:**调用线程的sleep方法,等sleep完毕,转入就绪;发出I/O请求,请求处理完毕,线程转入就绪状态。

死亡:

退出run方法时,线程会自然死亡。

图解:

在这里插入图片描述

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

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

相关文章

鸿蒙开发5.0【Code Linter实现代码检查】

Code Linter针对ArkTS/TS代码进行最佳实践/编程规范方面的检查。 检查方法&#xff1a; 编辑器自带Code Linter。 在已打开的代码编辑器窗口单击右键点击Code Linter&#xff0c;或在工程管理窗口中鼠标选中单个或多个工程文件/目录&#xff0c;右键选择Code Linter执行代码检…

2024年医疗器械企业5款CRM系统对比评测

医疗器械行业是一个多学科交叉、知识密集型、资金密集型的高新技术产业&#xff0c;进入门槛较高&#xff0c;产品种类繁多&#xff0c;技术含量较高。 随着医改的深入推进&#xff0c;医疗器械集采常态化成为行业新常态&#xff0c;中国的医疗器械行业不仅面临着巨大的市场潜…

zabbix6.4配置监控k8s 1.28集群

zabbix6.4配置监控rke2 rancher k8s集群 1. 说明1.1 为什么要使用zabbix6.x监控k8s1.2 部署环境1.3 部署前的一些问题 2. 使用helm3部署zabbix proxy和zabbix agent2.1 添加仓库2.2 修改配置2.3 部署2.4 确认部署情况 3. 在zabbix web页面配置连接zabbix proxy3.1 添加Proxy代理…

kali (linux) 配置windows远程桌面(mstsc.exe)连接

Kali 安装 tightvncserver 一、软件说明 1) tightvncserver是一个轻量级&#xff0c;只能建立桌面&#xff0c;不能查看TTY7/TTY1正在显示的桌面,但x11vnc可以&#xff0c;相比x11vnc安全传输差一些。反之&#xff0c;x11 vnc:安全传输较好&#xff0c;但占用资源比 tightvncs…

PB级内存计算项目实战-富华保险

一、保险项目的基本介绍 项目名称:富华阳光人寿保险 1. 行业背景介绍 在保险行业中,最为核心技术就是精算,精算简单来说就是根据人的年龄来计算应交保费问题,通过精算,让整个保险行业更加专业化,精细化 从而取代之间依靠经验判断的方式 精算到目前为止,并不仅仅计算保费,主要包…

Leetcode 1143. 最长公共子序列 记忆化搜索 优化 C++实现

Leetcode 1143. 最长公共子序列 问题&#xff1a;给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列的长度。如果不存在公共子序列&#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对…

一体化智能电动窗帘:开启智能生活新时尚

史新华 在科技不断进步的今天&#xff0c;人们对生活品质的追求也越来越高。电动窗帘作为智能家居的重要组成部分&#xff0c;以其便捷、智能、时尚的特点&#xff0c;正逐渐走进千家万户。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 一、电动窗帘…

KEYSIGHT U2020 X系列 USB峰值和均值功率传感器

​ _是德(KEYSIGHT) _ U2020 X系列 USB峰值和均值功率传感器 苏州新利通仪器仪表 U2020 X 系列功率传感器得到 Keysight BenchVue 软件的支持。使用 BenchVue 软件&#xff0c;您无需编程便可轻松控制功率计记录数据&#xff0c;并以各种形式显示测量结果。 只需将传感器…

AI大模型与量子纠缠理论的结合,以及相关应用思考

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下AI大模型与量子纠缠理论的结合&#xff0c;以及相关应用思考。将大模型&#xff08;LLM&#xff09;的基本原理与量子纠缠理论相结合是一个高度抽象的概念。我们首先需要理解这两个领域的基本原理&#xff0c;然后探…

#ARM开发 笔记

课程介绍 ARM开发 --> Linux移植 --> 驱动开发 前后联系&#xff1a;ARM和系统移植为驱动开发学习做准备工作 所需知识&#xff1a;C语言基础及STM32需要的硬件知识 学习方法 学习流程、思想和解决问题的方法即可 知道驱动的基本框架以及基本开发要求 底层课程导学 接口技…

NTFS安全权限和文件共享

一.常见文件系统 NTFS 描述&#xff1a; Windows最常使用的文件系统&#xff08;New Technology File System&#xff09;微软公司开发的一种专用于 Windows 操作系统的文件系统。 特点&#xff1a; 效率性 可以提高磁盘的读写性能&#xff1b; 可靠性 加密文件系统访问控制列…

Vue组件:使用Prop实现父组件向子组件传递数据

1、Prop 基本用法 由于组件实例的作用域是孤立的&#xff0c;因此子组件的模板无法直接应用父组件的数据。如果想要通过父组件向子组件传递数据&#xff0c;就需要定义 Prop。Prop 是父组件用来传递数据的一个自定义属性&#xff0c;这样的属性需要定义在组件选项对象的 props…

并发集合(二):CopyOnWriteArrayList

1、CopyOnWriteArrayList介绍 CopyOnWriteArrayList 是一个线程安全的ArrayList。 CopyOnWriteArrayList 是基于Lock锁和线程副本的形式来保证线程安全的&#xff0c; 在写数据时&#xff0c;先获取Lock锁&#xff0c;然后复制一个副本&#xff0c;添加数据时&…

Delphi7实现Json对象的序列化与反序列化

在高版本的 Delphi 中&#xff0c;实现序列化和反序列化非常简单。然而&#xff0c;在 Delphi 7 中&#xff0c;这个过程仍然需要一些额外的努力。为了简化这个问题&#xff0c;我花了一些时间封装了一个支持序列化和反序列化的 JSON 解析库。 type{$M}TStartupParameters cla…

MySQL的服务器与客户端:架构解析与实践

文章目录 MySQL的服务器和客户端服务端处理客户端请求连接管理解析与优化查询缓存语法解析查询优化 存储引擎不同的存储引擎查看支持的存储引擎为不同的表设置存储引擎 MySQL是一个广泛使用的开源关系数据库管理系统&#xff0c;其核心架构由服务器端和客户端两大部分组成。本文…

9/3 链表-力扣160 、203、206

160.相交链表 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函…

CUDA-MODE课程笔记 第9课: 归约(也对应PMPP的第10章)

我的课程笔记&#xff0c;欢迎关注&#xff1a;https://github.com/BBuf/how-to-optim-algorithm-in-cuda/tree/master/cuda-mode CUDA-MODE课程笔记 第9课: 归约&#xff08;也对应PMPP的第10章&#xff09; 课程笔记 本节课的题目。 这节课的内容主要是 Chapter 10 of PMPP …

TCP连接重置,到底怎么回事?还是得网工大佬来分析!

来源&#xff1a;科来。 连接建立失败并不仅仅包含无响应问题&#xff0c;还有一种常见的情况&#xff0c;即RST&#xff08;Reset&#xff09;包的发送。RST包是TCP协议中用来进行“连接重置”的数据包&#xff0c;本文将围绕RST包进行详细展开讨论。 TCP连接中为何会有RST包…

VideoCrafter1:Open Diffusion models for high-quality video generation

https://zhuanlan.zhihu.com/p/677918122https://zhuanlan.zhihu.com/p/677918122 视频生成无论是文生视频,还是图生视频,图生视频这块普遍的操作还是将图片作为一个模态crossattention进unet进行去噪,这一步是需要训练的,svd除此之外,还将图片和noise做拼接,这一步,很…

【压测】ab命令

安装 sudo yum install httpd-toolssudo apt update sudo apt install apache2-utils介绍 ab&#xff1a;参数数量错误 用法&#xff1a;ab [选项] [http[s]://]主机名[:端口]/路径 选项包括&#xff1a; -n 请求次数 执行的请求数 -c 并发数 同时发起的多个请求数量 -t 时间…