java 21 多线程

1.相关概念
进程:

进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存空间。当我们使用迅雷,又启动了一个进程,操作系统将为迅雷配新的内存空间。
进程是程序的一次执行过程,或是正在运行的一个程序。是动态过程:有它自身的产生、存在和消亡的过程

 线程:

线程是由进程创建的。是进程的一个实体;一个进程可以有多个线程;

Java 中线程被认为是一个CPU、程序代码、和数据的封装体。java.lang.Thread类使用户可以创建和控制自己的线程。在Java中,虚拟CPU是自动封装进Thread类的实例中,而Code和Data要通过一个对象传给Thread类的构造函数

        单线程:同一个时刻,只允许执行一个线程

        多线程:同一个时刻,可以执行多个线程

并发:

同一个时刻,多个任务交替执行 单核cpu实现的多任务就是并发 (造成一种“貌似同时”的错觉)

并行:

同一个时刻,多个任务同时执行。多核cpu可以实现并行

java从语言级别支持多线程  比如object中的wait(),notify()

线程体

线程的Code和Data构成线程体。线程体决定了线程的行为

通过run()方法来实现的 线程启动后系统就自动调用run()方法,通常,run方法执行了一个时间较长的操作

2.对线程的基本控制
a. 线程的启动: start()方法 

该方法的调用把嵌入在线程中的虚拟CPU置为可运行(Runnable)状态。Runnable状态意味着该线程可以参加调度,被JVM运行,并不意味着线程会立即执行

b.线程的结束:

设定一个标记变量,以结束相应的循环及方法

通知线程退出:

package xiancheng;
public class ThreadExit {public static void main(String[] args) throws InterruptedException {Cat1 cat = new Cat1();cat.start();//如果希望main线程去控制t1 线程的终止,必须可以修改loop// 让t1 退出run方法,从而终止t1线程->通知方式//让主线程休眠10秒,再通知t1线程退出System.out.println("main线程休息10s");Thread.sleep(10*1000);cat.setLoop(false);}
}
class Cat1 extends Thread{int times = 0;private boolean loop = true;@Overridepublic void run(){while (loop){System.out.println("11"+(++times)+Thread.currentThread().getName());//让该线程休眠一秒try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}if(times ==5){break;}}}public void setLoop(boolean loop) {this.loop = loop;}
}

暂时阻止线程的执行:

try {Thread.sleep(1000);
} catch (InterruptedException e) {throw new RuntimeException(e);
}

c.设定线程的优先级

d.线程分类

 

 

package xiancheng;import java.util.*;
public class TestThreadDaemon {public static void main(String args[]) {Thread t = new MyThread();t.setDaemon(true);t.start();
//主线程结束后 t也结束  将子线程设置成守护线程System.out.println( "Main--" + new Date());try{ Thread.sleep(500); }catch(InterruptedException ex){}System.out.println("Main End");}
}class MyThread extends Thread {public void run() {for(int i=0; i<10; i++ ){System.out.println(  i + "--" + new Date());try{ Thread.sleep(100); }catch(InterruptedException ex){}}}
}//输出:
//Main--Wed Dec 04 19:01:01 CST 2024
//0--Wed Dec 04 19:01:01 CST 2024
//1--Wed Dec 04 19:01:01 CST 2024
//2--Wed Dec 04 19:01:01 CST 2024
//3--Wed Dec 04 19:01:02 CST 2024
//4--Wed Dec 04 19:01:02 CST 2024
//Main End
3.线程常用方法
a.第一组:

 

Thread 类的静态方法currentThread( )返回当前线程。 

当线程的状态未知时,用isAlive( )确定线程是否活着。返回true 意味着线程已经启动,但还没有运行结束。

sleep方法:该方法用来使一个线程暂停运行一段固定的时间。在线程睡眠时间内,将运行别的线程。 sleep( ) 结束后,线程将进入Runnable状态。

b.第二组

 

package xiancheng;public class Threadjoin {public static void main(String[] args) throws InterruptedException {T3 t3 = new T3();t3.start();for (int i = 0; i <=6; i++) {Thread.sleep(1000);System.out.println("main————"+i);if(i==3){System.out.println("主线程执行3次了,就让子线程先执行(之前是同时执行的)");t3.join();System.out.println("子线程执行完了,主线程继续执行");}}}
}
class T3 extends Thread{@Overridepublic void run(){for (int i = 0; i <6 ; i++) {try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("子线程————————"+i);}}
}//子线程————————0
//main————0
//main————1
//子线程————————1
//子线程————————2
//main————2
//子线程————————3
//main————3
//主线程执行3次了,就让子线程先执行(之前是同时执行的)
//子线程————————4
//子线程————————5
//子线程执行完了,主线程继续执行
//main————4
//main————5
//main————6
//
//Process finished with exit code 0

 

4.创建线程
        a.继承Thread类

package xiancheng;public class Thread01 {public static void main(String[] args) throws InterruptedException {Cat cat = new Cat();cat.start();//启动线程  会启动Cat的run方法//main线程启动一个子线程 Thread-0,主线程不会阻塞,会继续执行//主线程和子线程交替执行System.out.println("主线程会继续执行"+Thread.currentThread().getName());for (int i = 0; i <10 ; i++) {System.out.println("主线程 i ="+i);Thread.sleep(1000);}}}
//1.当一个类继承了Thread类,该类就可以当成线程使用
//2.重写run方法,写上自己的代码
//3. run() 是Thread类实现了Runnable接口的run方法
class Cat extends Thread{int times = 0;@Overridepublic void run(){while (true){System.out.println("11"+(++times)+Thread.currentThread().getName());//让该线程休眠一秒try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}if(times ==5){break;}}}
}
         b.Runnable接口

一个线程就是Thread类的一个实例

package xiancheng;public class Thread02 {public static void main(String[] args) {Dog dog = new Dog();//dog.start();//不能调用该方法//创建Thread对象,把Dog对象(实现Runable接口),放入ThreadThread thread = new Thread(dog);thread.start();}
}
class Dog implements Runnable{int count = 0;public void run(){while (true){System.out.println("hi" + (++count)+Thread.currentThread().getName());//休眠一秒try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}if(count ==10){break;}}}
}
        c.多线程案列
package xiancheng;public class Thread03 {public static void main(String[] args) {T1 t1 = new T1();T2 t2 = new T2();Thread th1 = new Thread(t1);Thread th2 = new Thread(t2);th1.start();//启动第一个线程th2.start();//启动第二个线程}
}
class T1 implements Runnable{int count = 0;@Overridepublic void run() {//每隔一秒输出hewhile (true){System.out.println("he"+"|"+(++count));try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}if(count ==10){break;}}}
}
class T2 implements Runnable{int count = 0;@Overridepublic void run() {//每隔一秒输出hewhile (true){System.out.println("hello"+"|"+(++count));try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}if (count==10) {break;}}}
}
5.线程的生命周期

6.线程的同步 

线程同步机制
在多线程编程,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何同一时刻,最多有一个线程访问,以保证数据的完整性。
也可以这里理解:线程同步,即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作,其他线程才能对该内存地址进行操作。

同步的具体方法——Synchronized

a.同步代码块

Synchronized(对象){得到对象的锁才能操作同步代码}  锁加在this对象上默认情况下

b.Synchronized放在方法声明中,相当于Synchronized(this),表示整个方法为同步方法

public Synchronized void m (String name){//需要被同步的代码} 在同一时刻,只能有一个线程来执行该方  锁加在this对象上

互斥锁

 

要求多个线程的锁对象为同一个!!

线程的死锁:

多个线程都占用了对方的锁资源,但不肯相让,导致了死锁,在编程是一定要避免死锁的发生.

package xiancheng;class Worker
{int id;public Worker(int id){ this.id=id; }synchronized void doTaskWithCooperator(Worker other){try{ Thread.sleep(500); } catch(Exception e){}synchronized(other){System.out.println("doing" + id);}}
}class DeadLockDemo{public static void main(String[] args) {Worker w1 = new Worker(1);Worker w2 = new Worker(2);Thread td1 = new Thread(()->{w1.doTaskWithCooperator(w2);});Thread td2 = new Thread(()->{w2.doTaskWithCooperator(w1);});td1.start();td2.start();}
}
//在方法内部,首先使用Thread.sleep(500)让当前线程休眠 500 毫秒,
// 然后又嵌套了一个synchronized块,它以传入的另一个Worker对象other作为锁对象。
// 在这个内部的synchronized块中,只是简单地输出了当前Worker对象的id值,表示正在执行相关任务。
//这里存在产生死锁的隐患,因为它获取了自身实例对应的锁(方法级别的synchronized隐式锁)后,
// 又尝试去获取另一个Worker实例对应的锁(通过synchronized(other)),
// 如果多个线程以交叉的方式去获取锁,就可能导致死锁情况发生。
释放锁:

1.当前线程的同步方法、同步代码块执行结束

2.同步方法中遇到break、return
3.当前线程在同步代码块,同步方法中出现了未处理的Error或Exception,导致异常结束

4.同步方法中执行了线程对象的wait()方法,当前线程暂停,并释当前线程在同步代码块、放锁。

线程执行同步代码块或同步方法时,程序调用Thread.sleep()、Thread.yield()方法暂停当前线程的执行,不会释放锁
线程执行同步代码块时,其他线程调用了该线程的suspend()方法将该线程挂起该线程不会释放锁。

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

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

相关文章

Envoy-istio

最近研究envoy-istio&#xff0c;发现这个博客&#xff0c;觉得很不错&#xff0c;这里记录一下 envoy-istio介绍 envoy-istio - 随笔分类 - yaowx - 博客园 envoy部分七&#xff1a;envoy的http流量管理基础 envoy部分六&#xff1a;envoy的集群管理 envoy部分五&#xff…

【ETCD】ETCD用户密码认证

目录 概述 特殊用户和角色 root用户 root角色 用户操作 角色操作 启用身份验证 使用etcdctl进行身份验证 使用TLS通用名称 概述 etcd 2.1中增加了身份验证功能。etcd v3 API对身份验证功能的API和用户界面进行了轻微修改&#xff0c;以更好地适应新的数据模型。本指南…

蓝牙定位的MATLAB程序,四个锚点、三维空间

这段代码通过RSSI信号强度实现了在三维空间中的蓝牙定位&#xff0c;展示了如何使用锚点位置和测量的信号强度来估计未知点的位置。代码涉及信号衰减模型、距离计算和最小二乘法估计等基本概念&#xff0c;并通过三维可视化展示了真实位置与估计位置的关系。 目录 程序描述 运…

【计算机网络】实验4:生成树协议STP的功能以及虚拟局域网VLAN

实验 4&#xff1a;生成树协议STP的功能以及虚拟局域网VLAN 一、 实验目的 加深对生成树协议STP的功能的理解。 了解虚拟局域网VLAN。 二、 实验环境 • Cisco Packet Tracer 模拟器 三、 实验内容 1、验证交换机生成树协议STP的功能 (1) 第一步&#xff1a;构建网络拓…

VMware官网下载

访问官网 https://www.vmware.com/products/desktop-hypervisor/workstation-and-fusion 跳转到broadcom 注册 -> 登录 拉到下面 选择版本 然后填写地址信息&#xff0c; 随便写写&#xff0c; 再回去点下载按钮&#xff0c; 就可以下载了

智慧地图聚合(LockMap)标注系统开发说明文档

智慧地图聚合(LockMap)标注系统开发说明文档 1. 系统概述 智慧地图聚合(LockMap)标注系统是一个专为处理大规模地理信息数据而设计的综合解决方案。通过后端高效的数据管理和前端直观的地图展示&#xff0c;该系统能够实现对海量地理位置点的有效可视化。本项目旨在提供一个用…

【大数据学习 | Spark-SQL】定义UDF和DUAF,UDTF函数

1. UDF函数&#xff08;用户自定义函数&#xff09; 一般指的是用户自己定义的单行函数。一进一出&#xff0c;函数接受的是一行中的一个或者多个字段值&#xff0c;返回一个值。比如MySQL中的&#xff0c;日期相关的dateDiff函数&#xff0c;字符串相关的substring函数。 先…

linux 服务器 一次性查看 CPU、内存和磁盘使用情况

创建 vi check_usage.sh #!/bin/bashecho " CPU 使用率 " mpstat -P ALL 1 1echo -e "\n 内存使用情况 " free -hecho -e "\n 磁盘使用率 " df -h执行授权 chmod x check_usage.sh执行查看 ./check_usage.sh这样可以快速获取系统资源的概览。…

一文理解多模态大语言模型——下

作者&#xff1a;Sebastian Raschka 博士&#xff0c; 翻译&#xff1a;张晶&#xff0c;Linux Fundation APAC Open Source Evangelist 编者按&#xff1a;本文并不是逐字逐句翻译&#xff0c;而是以更有利于中文读者理解的目标&#xff0c;做了删减、重构和意译&#xff0c…

数据结构---链表(2)---双向链表

链表(1)中讲过了在OJ题中出现很多并且能作为一些复杂数据结构子结构的不带头单向不循环链表&#xff0c;下面讲解应用很广很实用的带头双向循环链表。 三、双向链表---DoublyLinkedList 演示带头双向循环链表(实用)。 带头--->不需要对空链表继续单独判断&#xff1b;循环…

PH热榜 | 2024-12-04

1. Stackfix 标语&#xff1a;几秒钟内就能对比软件。 介绍&#xff1a;立刻就能对比不同软件的价格和功能。不用再费力看各种评测或接推销电话了。我们提供实时价格、并排对比&#xff0c;还有专家的推荐建议。 产品网站&#xff1a; 立即访问 Product Hunt&#xff1a; V…

分布式光伏电站如何实现监控及集中运维管理?

安科瑞戴婷 Acrel-Fanny 前言 今年以来&#xff0c;在政策利好推动下光伏、风力发电、电化学储能及抽水蓄能等新能源行业发展迅速&#xff0c;装机容量均大幅度增长&#xff0c;新能源发电已经成为新型电力系统重要的组成部分&#xff0c;同时这也导致新型电力系统比传统的电…

AD学习笔记·空白工程的创建

编写不易&#xff0c;禁止搬运&#xff0c;仅供学习&#xff0c;感谢理解 序言 本文参考B站&#xff0c;凡亿教育&#xff0c;连接放在最后。 创建工程文件 在使用AD这个软件的电路板设计中&#xff0c;有很多的地方跟嘉立创eda还是有不一样的地方&#xff0c;其中一个地方就…

基于Java Springboot生鲜食品订购微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

【阅读笔记】Android广播的处理流程

关于Android的解析&#xff0c;有很多优质内容&#xff0c;看了后记录一下阅读笔记&#xff0c;也是一种有意义的事情&#xff0c; 今天就看看“那个写代码的”这位大佬关于广播的梳理&#xff0c; https://blog.csdn.net/a572423926/category_11509429.html https://blog.c…

第十三章 Linux计划任务

注意&#xff1a;进公司和有公司成员离职&#xff0c;一定要问计划任务&#xff0c;防止别人搞破坏背锅 13.1 一次性计划任务(atd服务) 1 安装 atd 服务 yum install -y at systemctl enable atd systemctl start atd ## 启动atd服务 systemctl status atd ## 查看atd服务…

Kali Linux使用Netdiscover工具的详细教程

Kali Linux使用Netdiscover工具的详细教程 引言 在网络安全和渗透测试的过程中&#xff0c;网络发现是一个至关重要的步骤。Netdiscover是Kali Linux中一个非常实用的网络发现工具&#xff0c;它可以帮助用户快速识别局域网中的活动设备。本文将详细介绍如何使用Netdiscover工…

EasyNVR中HTTP-FLV协议无法播放怎么解决?

在科技日新月异的今天&#xff0c;摄像头作为公共安全领域的重要一环&#xff0c;其技术的不断提升正显著地改变着社会的安全格局。从最初的简单监控到如今的高清智能分析&#xff0c;我们可以对特定区域进行实时监控和记录&#xff0c;为社会的安全稳定提供了强有力的保障。 问…

VINS_MONO视觉导航算法【一】基础知识介绍

文章目录 VINS-Mono其他文章说明简介单目相机存在的尺度不确定问题缺乏深度信息尺度等价性对极几何和三角化平移和深度的关系解决尺度不确定问题的方法视觉惯性里程计&#xff08;VIO&#xff09;初始尺度估计持续尺度校正 摄像头数据处理直接法&#xff08;Direct Method&…

「Mac畅玩鸿蒙与硬件42」UI互动应用篇19 - 数字键盘应用

本篇将带你实现一个数字键盘应用&#xff0c;支持用户通过点击数字键输入数字并实时更新显示内容。我们将展示如何使用按钮组件和状态管理来实现一个简洁且实用的数字键盘。 关键词 UI互动应用数字键盘按钮组件状态管理用户交互 一、功能说明 数字键盘应用将实现以下功能&…