当前位置: 首页 > news >正文

Java研学-多线程

一 名词解析

1 线程 : 控制指定APP(进程)执行的最基本单元(最小单位)

2 进程 : 硬件设备上的每一个应用程序

3 单线程 : 一个进程中只有一个线程执行,实际上基本没有这种情况

4 多线程 : 一个进程中至少有两个或两个以上的线程在执行

二 创建方式

1 共有三种:Thread类. Runnable接口,Callable接口

2 多线程操作:多个线程在同时一时刻操作共同资源

3 继承Thread类,重写run方法(编写多线程操作的代码),通过Thread类或Thread子类对象调用start方法开启多线程,并调用指定的run方法执行多线程操作,每次执行的结果都不一致

①Thread类:java中所有有关线程操作的类

// 子线程
public class SonThread extends Thread{public void run(){for(int i=0;i<20;i++){System.err.println("子线程::"+i);}}
}// 测试
public class ThreadTest {public static void main(String[] args) {SonThread st=new SonThread();for (int i = 0; i < 20; i++) {System.out.println("main::"+i);}// 调用重写的run方法,根据调用顺序执行线程操作(单线程按顺序执行)//st.run();// 实现多线程操作,通过Thread类对象调用start方法实现,run方法执行st.start();for (int i = 0; i < 20; i++) {System.err.println("main::"+i);}}
}

② 实现Runnable接口,重写run方法,需调用Thread类中的start方法开启多线程,并执行指定run方法,避免java中单继承的局限性,和继承带来的类与类之间的耦合度的增加

// 实现类
public class Son implements Runnable{@Overridepublic void run() {for (int i = 0; i < 500; i++) {System.err.println("Son::"+i);}}
}// 测试类
public class SonTest {public static void main(String[] args) {// 实例化实现Runable的对象Son s=new Son();// 与Thread类建立联系Thread t=new Thread(s);t.start();for (int i = 0; i < 500; i++) {System.out.println("main::"+i);}}
}

③ 实现Callable接口可返回结果并且可能抛出异常的任务。可以获得任务执行返回值;通过与Future的结合,可以实现利用Future来跟踪异步计算的结果。

// 实现callable接口
public class TestCallable implements Callable<Integer> {@Overridepublic Integer call() throws Exception {int i = 0;for (; i < 50; i++) {System.err.println("call::"+i);}return i;}
}// 使用
public class Play {public static void main(String[] args) {TestCallable tc = new TestCallable();FutureTask<Integer> ft = new FutureTask<>(tc);for (int i = 0; i < 100; i++) {System.out.println(Thread.currentThread().getName() + " 的循环变量i的值" + i);if (i == 20) {new Thread(ft, "有返回值的线程").start();}}try {System.out.println("子线程的返回值:" + ft.get());} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}
}

4 通过上述多线程操作,每次执行后,效果不一致,是因为多个线程同时操作相同资源,每个线程都会去"抢占"CPU的执行权,谁抢到,谁执行.实际上,是CPU在已开启的多个线程之间进行快速的切换,也称之为多线程执行的特点(随机性)

5 可提高指定线程的执行权限,java中为每个线程设置初始默认"等级",为5,等级取值范围[1,10],通过Thread类提供的指定的set方法去设置等级,即优先级;但是并不是优先级越大越先执行,而优先级的大小只是提高被执行完的可能

三 Thread类常见API

1 创建Thread类对象方法

public Thread()

2 将指定的Runnable接口的实现类对象,通过Thread构造器与Thread类建立联系

public Thread(Runnable r)

3 编写多线程操作代码方法

public void run()

4 开启多线程操作,并调用指定的run方法执行多线程

public void start()

5 获取当前线程的名字

public class SonThread extends Thread{public void run(){for(int i=0;i<50;i++){System.err.println(getName()+"::"+i);}}
}

6 在非Thread类子类中,获取当前正在执行线程对象

public class SonTest {public static void main(String[] args) {for (int i = 0; i < 50; i++) {System.out.println(Thread.currentThread()+"::"+i);}//Thread[main,5,main]::40}//格式为:线程名 优先级 线程的执行位置
}

7 让指定的线程睡眠指定的时间(时间的单位是毫秒数)

// public static void sleep(long millis)
public class SonThread extends Thread{public void run(){for(int i=0;i<50;i++){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.err.println(getName()+"::"+i);}}
}

8 给线程设置线程名

public class SonThread extends Thread{public void run(){setName("我是线程");for(int i=0;i<50;i++){System.err.println(getName()+"::"+i);}}
}// 或者
public class SonTest {public static void main(String[] args) {Thread.currentThread().setName("我是线程");for (int i = 0; i < 50; i++) {System.out.println(Thread.currentThread()+"::"+i);}}
}

9 设置和获取线程的优先级,优先级的取值范围[1,10]

public int getPriority()public class SonTest {public static void main(String[] args) {SonThread st=new SonThread();st.start();// 设置st.setPriority(10);for (int i = 0; i < 50; i++) {System.err.println(Thread.currentThread()+"::"+i);}// 获取System.out.println(st.getPriority());}
}

四 多线程的状态

在这里插入图片描述

状态权限
创建状态生存权
运行状态既有生存权又有执行权
消亡状态既没有生存权也没有执行权
临时(阻塞)状态只有生存权没有执行权

1 创建状态下的生存权和临时状态的生存权的区别

  在于多线程操作是否被开启;创建状态下,没有进行多线程操作;临时状态下的生存权在开启多线程之后,没有获取到执行权

2 处于临时状态下的线程存储位置是在由jvm虚拟机提供的线程池,进出的原则,先进先出(类似于吸管,也称之为队列式数据存储

3 等待唤醒机制的等待和唤醒方法定义在Object类中,而不是定义在Thread类中

  由于实际开发中,并不是所有的类都要继承Thread类,但是只要是java的类就是多线程操作,等待和唤醒的方法是共性的,需要定义在所有类的父类中,因此就把它定义在了Object类中,实际大家更喜欢用sleep来完成多线程操作:到时候自动苏醒

五 案例-火车站窗口售票

// 测试类
public class Test {public static void main(String[] args) {Window w=new Window();//通过Thread构造器建立连接// 多线程操作时,多个线程可以同时操作共同资源,当一个线程操作时,其他的线程也有操作的可能Thread w1=new Thread(w);Thread w2=new Thread(w);Thread w3=new Thread(w);w1.start();w2.start();w3.start();}
}// 同步代码块版Window 
public class Window implements Runnable{private int tickets=100;@Overridepublic void run() {// 火车站窗口24小时开放while (true){// 添加锁,防止超卖问题(3种)// Object obj=new Object();// this --本类对象锁// Window.class --反射机制锁,通过字节码文件获取synchronized (Window.class){//同步代码块try {Thread.sleep(10);} catch (Exception e) {e.printStackTrace();}if(tickets > 0){System.err.println(Thread.currentThread().getName()+"::"+tickets--);}}}}
}    // 同步函数版Window 
public class Window implements Runnable{private int tickets=100;@Overridepublic void run() {// 火车站窗口24小时开放while (true){fun();}}// 同步函数private synchronized void fun() {if(tickets > 0){try {Thread.sleep(10);} catch (Exception e) {e.printStackTrace();}System.err.println(Thread.currentThread().getName()+"::"+tickets--);}}
}

同步函数和同步代码块的区别

  ① 同步代码块有3把锁:Object对象锁 this本类对象锁 反射机制锁

  ② 同步函数有1把锁:this本类对象锁

  ③ 同步函数只能锁定当前对象(即this),而同步代码块可以锁定任意对象。

  ④ 同步函数的锁是在方法调用时自动加上的,而同步代码块需要手动指定锁对象。

  ⑤ 同步函数的锁是在方法调用结束时自动释放的,而同步代码块需要手动释放锁。

相关文章:

Java研学-多线程

一 名词解析 1 线程 : 控制指定APP(进程)执行的最基本单元(最小单位) 2 进程 : 硬件设备上的每一个应用程序 3 单线程 : 一个进程中只有一个线程执行,实际上基本没有这种情况 4 多线程 : 一个进程中至少有两个或两个以上的线程在执行 二 创建方式 1 共有三种:Thread类. R…...

【日常总结】如何禁止浏览器 http自动跳转成https

一、场景 二、问题 三、解决方案 3.1 chrome 浏览器 3.2 edge 浏览器&#xff1a; 3.3 Safari 浏览器 3.4 Firefox 浏览器 3.5 Microsoft Edge 一、场景 公司网站 http:// 谷歌浏览器中自动转换成 https:// 导致无法访问 二、问题 nginx配置ssl 443接口&#xff0c; ht…...

文本转语音:微软语音合成标记语言 (SSML) 文本结构和事件

​ SSML 的语音服务实现基于万维网联合会的语音合成标记语言版本 1.0。 ​ 语音服务支持的元素可能与 W3C 标准不同。 每个 SSML 文档是使用 SSML 元素&#xff08;或标记&#xff09;创建的。 这些元素用于调整语音、风格、音节、韵律、音量等。 下面是 SSML 文档的基本结构…...

计算机网络之物理层(数据通信有关)

一、概述 1.1物理层引入的目的 屏蔽掉传输介质的多样性&#xff0c;导致数据传输方式的不同&#xff1b;物理层的引入使得高层看到的数据都是统一的0,1构成的比特流 1.2.物理层如何实现屏蔽 物理层靠定义的不同的通信协议&#xff08;一般称通信规程&#xff09; 这些协议…...

安卓开发之HTTP API服务接口设计(基于okhttp3请求)

安卓中的请求 OkHttp3 是一个开源的 Java/Android HTTP 客户端库,由 Square 公司开发。它提供了简洁和高效 的 API ,用于进行 HTTP 请求、处理响应以及与服务器进行通信。 以下是 OkHttp3 的一些主要特点和功能: 简单易用: OkHttp3 提供了简洁的 API ,使得发送 HTTP 请求变…...

我的第一次SACC之旅

今年有很多第一次&#xff0c;第一次作为“游客”参加DTCC&#xff08;中国数据库大会&#xff09;&#xff0c;第一次作为讲师参与ACDU中国行&#xff08;成都站&#xff09;&#xff0c;第一次参加OB年度发布会&#xff08;包含DBA老友会&#xff09;&#xff0c;而这次是第一…...

Codeforces Round 908 (Div. 2)

Codeforces Round 908 (Div. 2) 文章目录 Codeforces Round 908 (Div. 2)ABCD A 获取对战的最后一个即为胜者 #include <bits/stdc.h>using namespace std;void solve() {int n;cin >> n;string s;cin >> s;cout << s[n-1] << endl; }int main…...

Java实现-数据结构 2.时间和空间复杂度

.如何衡量一个算法的好坏&#xff1a;时间复杂度和空间复杂度 算法效率分为时间效率和空间效率&#xff0c;时间效率称为时间复杂度&#xff0c;空间效率称为空间复杂度 时间复杂度 算法的时间复杂度是一个数学函数&#xff0c;它描述了算法的运行时间&#xff0c;一个算法执…...

Docker exec命令

docker exec &#xff1a;在运行的容器中执行命令。 语法&#xff1a; docker exec [OPTIONS] CONTAINER COMMAND [ARG...]OPTIONS说明&#xff1a; -d&#xff1a;分离模式&#xff1a; 在后台运行 -i&#xff1a;即使没有附加也保持STDIN打开 -t&#xff1a;分配一个伪终…...

可燃气体监测仪助力燃气管网安全监测,效果一览

城市地下管线是指城市范围内供应水、排放水、燃气等各类管线及其附属设施&#xff0c;它们是保障城市正常运转的重要基础设施且影响着城市生命线。其中燃气引发的事故近些年不断增加&#xff0c;由于燃气管线深埋地下环境复杂&#xff0c;所以仅仅依赖人工巡查难以全面有效地防…...

Kafka(二)在WSL搭建Schema Registry

目录 1 Avro与Schema Registry2 搭建Schema Registry2.1 下载Confluent并解压2.2 设置环境变量2.3 修改配置2.4 启动服务 3 API列表 1 Avro与Schema Registry Apache Avro 是一种高效的数据序列化系统&#xff0c;用于在不同的应用程序和平台之间传输和存储数据。它提供了一种…...

webrtc AEC 线性滤波 PBFDAF(均匀分块频域自适应滤波)介绍

计算一个脉冲响应和输入信号的卷积&#xff0c;除了使用原始的时域卷积以外&#xff0c;还有如下方法&#xff1a; FFT卷积的方法&#xff1a;对输入信号&#xff08;长度M&#xff09;和脉冲响应&#xff08;长度N&#xff09;分别补零到K&#xff08;K>MN-1)&#xff0c;…...

开源vs闭源,处在大模型洪流中,向何处去?

文章目录 一、开源和闭源的优劣势比较1.1 开源优势1.2 闭源的优势 二、开源和闭源对大模型技术发展的影响2.1 数据共享2.2 算法创新2.3 业务拓展2.4 安全性和隐私2.5 社会责任和伦理 三、开源与闭源的商业模式比较3.1 盈利模式3.2 市场竞争3.3 用户生态3.4 创新速度 四&#xf…...

web前端之vue和echarts的堆叠柱状图顶部显示总数、鼠标悬浮工具提示、设置图例的显示与隐藏、label、legend、tooltip

MENU 效果图htmlJavaScripstyle解析 效果图 html <template><div><div><div id"idStackedColumnChart" style"width: 100%; height: 680px"></div></div></div> </template>JavaScrip export default {…...

Excel表中合并两个Sheet的方法?

按AltF11&#xff0c;调出Visual Basic 界面。 在左侧窗口中&#xff0c;右键选择“插入”—“模块”&#xff1a; 将如下代码粘贴进去&#xff0c;点击运行按钮&#xff0c;完成数据表合并。 Sub MergeAllSheetsInThisWorkbook() On Error Resume Next Application.ScreenU…...

1个10进制数转为2进制和转为8进制, 各位上数字后2进制的值与8进制的值相同的值有 1 8 9 64 问第23个值是多少?

1个10进制数转为2进制和转为8进制&#xff0c; 各位上数字后2进制的值与8进制的值相同的值有 1 8 9 64 问第23个值是多少&#xff1f; #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include<cmath&g…...

27、Nuxt.js项目整合ElementUI组件库

参考element-ui官网安装组件库 项目中新建插件引入element-ui plugins\element-ui.js import Vue from vue; import ElementUI from element-ui;Vue.use(ElementUI);nuxt.config.js plugins: ["/plugins/element-ui.js"],build: {// 将位于 node_modules 目录下的…...

设计问卷调查问题的9大技巧!技巧1:明确目标与问题

我们在设计问卷调查时要考虑很多因素&#xff0c;其中问卷问题是需要关注的重要因素之一。有效的问题能够帮助我们获取到有用的信息&#xff0c;让问卷结论更准确。怎么设计问卷调查的问题呢&#xff1f;本文就为大家提供几个设计问题时的神仙技巧&#xff01; Tip1&#xff1…...

java代码调用twitter-api用例实战

一、申请twitter开发者账号 首先先申请twitter开发者免费的API&#xff0c;要填写申请的内容&#xff0c;放心大胆地写&#xff0c;申请完&#xff0c;会提供免费的API接口。 以下是我申请到的三个免费API 申请完开始进行测试调用。 读官方文档账户认证那块&#xff1a;https…...

UniWebView的更新日志【### 5.3.0 (28 Jan, 2023)】

UniWebView的更新日志 # Release Note ### 5.3.0 (28 Jan, 2023) #### Add * Support for customization of Kotlin and Android Browser package versions. This can help to resolve the conflict with other plugins which use another version of these packages. ###…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略&#xff08;地理位置/文件&#xff09; 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型&#xff0c;核心实现方式&#xff1a; 标准消息类型&#xff1a;直接使用 SDK 内置类型&#xff08;文件、图片等&#xff09;自…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...