Java多线程入门

进程与线程

**进程:**每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。(进程是资源分配的最小单位)
**线程:**同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是cpu调度的最小单位)
**线程和进程一样分为五个阶段:**创建、就绪、运行、阻塞、终止
**Java线程有六个状态:**NEW(新建)、RUNNABLE(可运行)、BLOCKED(阻塞)、TIMED_WAITING(指定时间等待)、TERMINATED(终止)
Java线程是不区分 Ready(就绪)和 Running(运行)的,它们都是 Runnable 状态。
多进程是指操作系统能同时运行多个任务(程序),同一程序中有多个顺序流在执行。
在java中要想实现多线程,有两种手段,一种是继承Thread类,另外一种是实现Runable接口。(其实准确来讲,应该有三种,还有一种是实现Callable接口,并与Future、线程池结合使用)

一、创建与调用线程

1.创建类继承 Thread 类,重写 run 方法

public class MyThread extends Thread {/*** run 方法就是线性要执行的任务方法*/@Overridepublic void run() {// 这个的代码,就是一条新的执行路径// 这个执行路径的触发方式,不是调用 run 方法,而是通过 thread 对象的 start() 来启动任务for (int i = 0; i < 10; i++) {System.out.println("分支任务执行"+i);}}
}public class Test {/*** 多线程技术*/public static void main(String[] args) {MyThread m = new MyThread();m.start();for (int i = 0; i < 10; i++) {System.out.println("主任务执行"+i);}}
}

运行结果每次都会不一样,这是两个线程相互抢占,使用抢占式分配的结果,故后续相同功能的代码运行结果省略:

主任务执行0
主任务执行1
分支任务执行0
主任务执行2
分支任务执行1
主任务执行3
分支任务执行2
分支任务执行3
主任务执行4
主任务执行5
主任务执行6
分支任务执行4
主任务执行7
分支任务执行5
主任务执行8
分支任务执行6
主任务执行9
分支任务执行7
分支任务执行8
分支任务执行9

2.使用匿名内部类创建线程

public static void main(String[] args) {new Thread(){@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println("分支任务执行"+i);}}}.start();for (int i = 0; i < 10; i++) {System.out.println("主任务执行"+i);}
}

3.创建类继承 Runnable 接口,重写 run 方法

public class MyRunnable implements Runnable {@Overridepublic void run() {// 线程的任务for (int i = 0; i < 10; i++) {System.out.println("分支任务执行"+i);}}
}public class Test {/*** 多线程技术*/public static void main(String[] args) {// 实现 Runnable// 1. 创建一个任务对象MyRunnable r = new MyRunnable();// 2. 创建一个线程,并为其分配一个任务Thread t = new Thread(r);// 3. 执行这个线程t.start();for (int i = 0; i < 10; i++) {System.out.println("主任务执行"+i);}}
}

4.使用匿名内部类实现 Runnable

public static void main(String[] args) {Thread t = new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println("分支任务执行"+i);}}});t.start();for (int i = 0; i < 10; i++) {System.out.println("主任务执行"+i);}
}

5.使用 Lambda 表达式,这是一个面向函数的编写方式,其中:

注:括号代表重写的方法,方法名可省略,括号内部可传参数类型,大括号中是重写的方法内容,大括号外可传参数的值

public static void main(String[] args) {Thread t = new Thread(() -> {for (int i = 0; i < 10; i++) {System.out.println("分支任务执行"+i);}});t.start();for (int i = 0; i < 10; i++) {System.out.println("主任务执行"+i);}
}

另外:实现 Runnable 与继承 Thread 相比有如下优势

  • 通过创建任务,然后给线程分配的方式来实现多线程,更适合多个线程同时执行相同任务的情况
  • 可以避免单继承所带来的局限性,实现 Runnable 可以继承其他的类增强实用性
  • 任务与线程本身是分离的分离的,提高了程序的健壮性
  • 线程池技术只接受 Runnable 类型的任务,而不接受 Thread 类型的线程

二、操作线程的常用方法

1.设置和获取线程名称

public static void main(String[] args) {System.out.println(Thread.currentThread().getName());new Thread(new MainRunnable(),"分支任务").start();
}static class MainRunnable implements Runnable{@Overridepublic void run() {System.out.println(Thread.currentThread().getName());}
}

运行结果如下,若不传进程名称只传目标类,则会生成默认名称:Thread-0,后续创建的进程名称依次加一: Thread-1、Thread-2……

main
分支任务

2.线程休眠 sleep,在任何线程中均能使用,能使当前正在执行的线程休眠(暂时停止执行)指定的时间,常用传入参数为毫秒

public static void main(String[] args) throws InterruptedException {for (int i = 0; i < 10; i++) {System.out.println(i);Thread.sleep(1000);}
}

3.线程的中断 interrupt,需要注意的是,这个方法只是给进程添加了一个标记,这个标记能被 InterruptedException 捕捉进入 catch 部分的代码,可在此处进行结束进程、释放资源等操作

public static void main(String[] args) throws InterruptedException {Thread t = new Thread(() -> {for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+":"+i);try {Thread.sleep(1000);} catch (InterruptedException e) {// 1. e.printStackTrace();// 2. System.out.println("发现了中断标记");// 3.System.out.println("发现了中断标记,令进程死亡");return;}}});t.start();for (int i = 0; i < 5; i++) {System.out.println(Thread.currentThread().getName()+":"+i);Thread.sleep(1000);}t.interrupt();
}

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

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

相关文章

点成方案丨使用细胞计数仪监控CAR-T细胞疗法的生产

一、概述 嵌合抗原受体&#xff08;CAR&#xff09;是经过改造后赋予T细胞靶向特定抗原的新能力的受体蛋白。这些受体是嵌合的&#xff0c;因为它们将抗原结合和T细胞激活功能结合到一个受体中。CAR-T细胞疗法使用经过CAR改造的T细胞来治疗癌症。CAR-T免疫疗法的前提是修改T细…

PHP原生类总结利用

SPL介绍 SPL就是Standard PHP Library的缩写。据手册显示&#xff0c;SPL是用于解决典型问题(standard problems)的一组接口与类的集合。打开手册&#xff0c;正如上面的定义一样&#xff0c;有许多封装好的类。因为是要解决典型问题&#xff0c;免不了有一些处理文件…

如何使用iPhone15在办公室观看家里电脑上的4k电影?

如何使用iPhone15在办公室观看家里电脑上的4k电影&#xff1f; 文章目录 如何使用iPhone15在办公室观看家里电脑上的4k电影&#xff1f;1.使用环境要求&#xff1a;2.下载群晖videostation&#xff1a;3.公网访问本地群晖videostation中的电影&#xff1a;4.公网条件下使用电脑…

论文浅尝 | 用于开放式文本生成的事实增强语言模型

笔记整理&#xff1a;李煜&#xff0c;东南大学硕士&#xff0c;研究方向为知识图谱 链接&#xff1a;https://proceedings.neurips.cc/paper_files/paper/2022/hash/df438caa36714f69277daa92d608dd63-Abstract-Conference.html 1. 动机 生成式语言模型&#xff08;例如 GPT-3…

CNCC 2023收官,Milvus Cloud与行业大咖共话向量数据库系统

近期,CNCC 2023 在沈阳圆满结束,紧凑、前沿的 129 场技术论坛让人印象深刻。据悉,这 129 场技术论坛涵盖人工智能、安全、计算+、软件工程、教育、网络、芯片、云计算等 30 余个方向。Zilliz 受邀参与【智能时代的大数据系统】技术论坛。 智能时代的到来,无疑给社会经济和日…

【深度学习】SimSwap: An Efficient Framework For High Fidelity Face Swapping 换脸,实战

代码&#xff1a;https://github.com/neuralchen/SimSwap 文章目录 摘要介绍RELATED WORK实验结论代码实操 SimSwap是一个高保真度人脸交换的高效框架。它将源脸的身份转移到目标脸上&#xff0c;同时保留目标脸的属性。该框架包括ID注入模块&#xff08;IIM&#xff09;&#…

linux网络流量数据统计

两种方法&#xff1a; 1.ifcong来进行获取 2. [rootnode1 shell]# cat /proc/net/dev Inter-| Receive | Transmitface |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo co…

Avatar虚拟形象解决方案,趣味化的视频拍摄与直播新体验

企业们正在寻找新的方式来吸引和保持观众的注意力,一种新兴的解决方案就是使用Avatar虚拟形象技术&#xff0c;这种技术可以让用户在视频拍摄或直播场景中&#xff0c;以自定义的数字人形象出现&#xff0c;同时保持所有的表情和脸部驱动。美摄科技正是这个领域的领军者&#x…

Redhat Linux v8.2 实时内核环境配置及参数调优

Redhat-Linux V8.2 实时内核环境配置及参数调优 -------物理机 & 虚拟机 一、前言 本文档包含有关Redhat Linux for Real Time的基本安装和调试信息。许多行业和组织需要极高性能的计算&#xff0c;并且可能需要低且可预测的延迟&#xff0c;尤其是在金融和电信行业中。延…

[RK-Linux] updateEngine工具使用以及代码分析

Rockchip Linux 平台支持两种启动方案,Recovery 模式和Linux A/B 模式: Recovery 模式,设备上有一个单独的分区(recovery)用于升级操作。Linux A/B 模式,设备上有两套固件,可切换使用。两种启动方案的对比如下: 升级方案代码路径是否支持Recovey启动模式升级是否支持A/B启…

【工艺库】SMIC数字后端工艺库

工艺库文件 Calibredigital文件夹apollolefprimetimesynopsys TD系列文件夹 本来是想找一个工艺库&#xff0c;想要其包含逻辑综合和SPICE Model相关的库文件&#xff0c;但是找了很久也没有直接找到想要的&#xff0c;主要原因还是自己对工艺库文件的构成不是很清楚&#xff0…

小程序样式问题

小程序切换下一个文章或者页面&#xff0c;淡入淡出效果 // detail.js getArticleData: function(articleId) {// 开始淡出效果this.animate(.detail-page, [{ opacity: 1.0, ease: ease-out },{ opacity: 0.0, ease: ease-out }], 500, () > {// 在淡出动画完成后请求文章…

《QT从基础到进阶·二十六》绘制多个图形项(QGraphicsRectItem,QGraphicsLineItem,QGraphicsPolygonItem)

这个demo用QT实现了对多个图形项的绘制&#xff0c;包括矩形的绘制&#xff0c;直线的绘制和多边形的绘制&#xff0c;是之前一章中绘制矩形的增强版&#xff0c;之前一章节关于矩形的绘制可以参考&#xff1a;《QT从基础到进阶十五》用鼠标绘制矩形&#xff08;QGraphicsView、…

Web安全:Vulfocus 靶场搭建.(漏洞集成平台)

Web安全&#xff1a;Vulfocus 靶场搭建.&#xff08;漏洞集成平台&#xff09; Vulfocus 是一个包含了多种漏洞靶场的镜像。每个靶场都有具体的漏洞环境和攻击点。Vulfocus 的靶场包括了 Web 安全漏洞、系统安全漏洞、网络安全漏洞、密码学漏洞等多种类型。通关这个靶场我们可以…

基于STM32的物联网体感控制机械臂

摘 要 随着我国微型电子技术和嵌入式系统的发展&#xff0c;目前行业内相对比较传统的机械臂无法满足客户的需求。为了改进传统机械臂在控制上得短板问题&#xff0c;在本次毕业设计中&#xff0c;将使用相对先进、快捷、智能的控制机制。该系统的控制大脑为核心控制器32系列嵌…

哪些方面的应用适合博捷芯双轴半自动划片机?

博捷芯BJX3666系列双轴半自动划片机可以应用于以下领域&#xff1a; 1. 集成电路制造&#xff1a;在集成电路制造中&#xff0c;划片机可以用来将芯片从晶圆上切割下来&#xff0c;以便进行封装和测试。此外&#xff0c;还可以用来对芯片进行划片分离加工&#xff0c;以得到所需…

Java整合Redis实现坐标附近查询

目录 一、GEO用法引入 二、引入依赖 三、实体类 四、添加位置信息 五、查询位置信息 一、GEO用法引入 GEO&#xff0c;全称Geolocation&#xff0c;代表地理坐标。可以在其中存储地理坐标信息&#xff0c;帮助我们根据经纬度来检索数据。常见的命令有&#xff1a;GEOADD&…

python 爬虫之urllib 库的相关模块的介绍以及应用

文章目录 urllib.request 模块打开 URL&#xff1a;发送 HTTP 请求&#xff1a;处理响应&#xff1a; 应用如何读取并显示网页内容提交网页参数使用HTTP 代理访问页面 urllib.request 模块 在 Python 中&#xff0c;urllib.request 模块是用于处理 URL 请求的标准库模块之一。…

学习c#的第十一天

目录 C# 结构体&#xff08;Struct&#xff09; 定义结构体 C# 结构的特点 类 vs 结构 C# 枚举&#xff08;Enum&#xff09; 声明 enum 变量 实例 C# 结构体&#xff08;Struct&#xff09; 定义结构体 在 C# 中&#xff0c;定义结构体使用关键字 struct。下面是一个…

【JMeter】组件之 Listener监听器选择

JMeter中监听器的作用就是收集、显示JMeter取样器的结果&#xff0c;并以树形、图表、表格的形式显示出来。还可以将监听结果保存成文件。 View Results Tree-->察看结果树 Summary Report-->汇总报告 为测试中的每个不同命名的请求创建一行。这与聚合报告类似&#xff…