Java基础-学习笔记16

news/2024/11/15 15:58:54/文章来源:https://www.cnblogs.com/97gogo/p/18387108

16 线程(基础)

1. 相关概念

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

线程:线程由进程创建的,是进程的一个实体。一个进程可以拥有多个线程。(比如一个QQ进程,可以同时打开多个聊天窗口,一个迅雷进程,可以同时下载多个文件。)

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

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

并发:同一个时段,多个任务交替执行,造成一种“貌似同时”的错觉,简单的说,单核cpu实现的多任务就是并发。

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

2. 线程基本使用

2.1 创建线程的两种方式

  • 2.1.1 继承 Thread 类,重写 run 方法
 public static void main(String[] args) throws InterruptedException{// 创建 Cat 对象,Cat 已继承 Thread,实现 run 方法。可以当作线程使用Cat cat = new Cat();cat.start(); // 启动线程,最终会直接执行 Cat 的 run 方法for (int i = 0; i < 10; i++) {System.out.println("主线程 i = "+ i);}Thread.sleep(1000); // 让主线程也间断休眠}
// 运行程序时,开启一个进程
// 执行 main 方法,此时进程会开启一个主线程(main 线程)
// 执行 Cat.start(),此时 main 线程会再开一个 子线程,Thread-0
// 主线程,不会阻塞,会继续执行fori。主线程和子线程在交替执行...
// 可以在终端输入jconsole监控线程执行情况。

Q:为什么是 start() 方法,不直接调 run()?

因为run方法是一个普通的方法,如果直接调,会作为一个普通方法串行来执行,并未真正启动一个线程。
此时,当run方法执行完毕,才会继续执行后面的语句。

源码分析

start() 方法里,调用 start0() 方法。
start0() 是本地方法,由 JVM 调用的。具体如何执行,取决于 CPU,也与操作系统、内存资源、IO资源等有关。
真正实现多线程的效果,是 start0(),而不是 run()。可以理解为,在 start0() 里面,用多线程的机制来调用 run 方法。

  • 2.1.2 实现 Runnable 接口,重写 run 方法

Java 是单继承的,在某些情况下一个类可能以及继承了某个父类,这时再用继承 Thread 类方法来创建线程显然不可能了。

此时可通过另外一个方式创建线程,就是通过实现 Runnable 接口来创建线程。

public static void main(String[] args) throws InterruptedException
{Dog dog = new Dog();// Dog 实现了 Runnable 接口,并重写了 run 方法。// dog.start(); // 这里无法调用start编译报错。更不能改用run原因同上。// 应当 创建一个 Thread 对象,把 dog 带进去。这里底层使用了设计模式 [代理模式]。Thread t1 = new Thread(dog);t1.start();
}
  • 2.1.3 两种方式的区别
  1. 从 Java 的设计来看,通过继承 Thread 或者实现 Runnable 接口来创建线程本质上没有区别,因为二者在底层都是通过调用 start0() 来实现的。

  2. 实现 Runnable 接口方式更加适合多个线程共享一个资源的情况,并且避免了单继承的限制。

2.2 多线程执行

public static void main(String[] args) throws InterruptedException
{Cat cat = new Cat();cat.start();  // 启动第一个子线程Dog dog = new Dog();Thread t1 = new Thread(dog); t1.start();  // 启动第二个子线程for (int i = 0; i < 30; i++)  // 主线程{System.out.println("main~~~~");}
}
class Dog implements Runnable
{@Overridepublic void run() {int t = 0;while (t < 50){System.out.println("wo~~~~");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}class Cat extends Thread
{@Overridepublic void run(){int time = 0;while (time < 20){System.out.println("miao~~~~");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}time += 1;}}
}

3. 线程终止

  • 基本说明:
  1. 当线程完成任务后,会自动退出。

  2. 还可以通过使用变量来控制 run 方法退出的方式停止线程,即通知方式
    比如,子线程的run方法里是一个循环方法,可在子线程里设置loop变量控制循环,并设置setLoop方法控制loop的值。那么,在main线程里,只需要通过调用setLoop方法即可控制子线程退出run方法。

  • 线程常用方法


  • 注意事项和细节

  • 线程状态

4. 线程的同步

  • 定义:
  1. 在多线程编程里,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何同一时刻,最多有一个线程访问,以保证数据的完整性。

  2. 也可以理解为,线程同步,即当有一个线程在对内存进行操作时,其它线程都不可以对这个内存地址进行操作,直到该线程完成操作,其它线程才能对该内存地址进行操作。

  • 具体方法:
  1. 同步代码块
synchronized(对象) // 得到对象的锁,才能操作同步代码块
{// 需要被同步的代码 
}
  1. synchronized 还可以放在方法声明中,表示整个方法为同步方法
public synchronized void m()
{// 需要被同步的代码
}

5. 互斥锁

  • 基本介绍:
  1. Java语言中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。

  2. 每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任意时刻,只能有一个线程访问该对象。

  3. 关键字 synchronized 来与对象的互斥锁联系。当某个对象用 synchronized 修饰时,表明该对象在任一时刻只能由一个线程访问。

  4. 同步的局限性:导致程序的执行效率要降低

  5. 同步方法(非静态的)的锁,其实是加在当前对象的。也可以是其它对象(要求是同一个对象,否则锁不上)

  6. 同步方法(静态的)的锁为当前类本身。

6. 线程的死锁

多个线程都占用了对方的锁资源,但不肯想让,导致了死锁,在编程时要避免死锁的发生。

  • 释放锁:
  1. 当前线程的同步方法、同步代码块执行结束
  2. 当前线程在同步代码块、同步方法中遇到 break、return
  3. 当前线程在同步代码块、同步方法中出现了未处理的 error 或 exception,导致异常结束
  4. 当前线程在同步代码块、同步方法中执行了线程对象的 wait() 方法,当前线程暂停,并释放锁
  • 下面操作不会释放锁:
  1. 线程执行同步代码块或同步方法时,程序调用 Thread.sleep()、Thread.yield() 方法暂停当前线程的执行,不会释放锁
  2. 线程执行同步代码块时,其它线程调用了该线程的 suspend() 方法将该线程挂起,该线程不会释放锁。(最好避免使用)

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

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

相关文章

Rocky9怎么把网卡名由ens33修改为eth0

环境查看``` 系统环境# cat /etc/redhat-release Rocky Linux release 9.3 (Blue Onyx) # uname -a Linux RockyTemplete 5.14.0-362.18.1.el9_3.0.1.x86_64 #1 SMP PREEMPT_DYNAMIC Sun Feb 11 13:49:23 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux修改配置文件 修改以下配置文…

章10——面向对象编程(高级部分)——代码块

代码块/初始化块与方法的区别: 无方法名、返回、参数,仅方法体。 不用通过对象或类显示调用,加载类/创建对象时隐式调用。代码块的好处:总结:在有多个构造器的类中,可以把每个构造器中都需要有的重复语句抽取出来单独作为代码块,大大提高了程序的复用性。 public class …

7-8月月报 | Apache SeaTunnel社区进展一览

各位热爱 Apache SeaTunnel 的小伙伴们,社区 7-8 月份月报来啦!这两个月项目有了哪些进展?又有谁登上了我们社区的贡献者榜单呢?快来一睹为快吧。 Merge Stars 感谢以下小伙伴上两个月为 Apache SeaTunnel 项目和社区发展所做的精彩贡献(排名不分先后):@Hisoka-X,@xxsc0…

易基因:血液Target-BS揭示靶向DNA甲基化标记水平与患者乳腺癌风险相关|Nature子刊

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 符合遗传性乳腺癌和卵巢癌(HBOC)标准的患者中,只有不到15-20%携带致病性编码基因突变,意味着可能存在其他分子机制导致这种疾病的风险增加。外周血DNA甲基化是乳腺癌(BC)风险的潜在表观遗传标记。在分子…

Apifox 私有化部署企业版价格

Apifox 是一个企业级 API 研发一体化协作平台,提供从 API 管理、研发到自动化测试的协同模式。它支持多种 API 协议,包括 HTTP/2、WebSocket、gRPC、Dubbo、GraphQL 等,帮助企业轻松管理 API 数字资产。下面来聊聊 Apifox 的私有化部署解决方案,这可是个为企业量身定制的全…

Python 在PDF中添加条形码、二维码

在PDF中添加条码是一个常见需求,特别是在需要自动化处理、跟踪或检索PDF文件时。作为一种机器可读的标识符,PDF中的条码可以包含各种类型的信息,如文档的唯一标识、版本号、日期等。以下是一篇关于如何使用Python在PDF中添加条形码或二维码的文章。所需Python库 Spire.PDF f…

AI图像放大工具,图片放大无所不能

AI图像放大工具,如ESRGAN,对于提高由Stable Diffusion生成的AI图像质量至关重要。它们被广泛使用,以至于许多Stable Diffusion的图形用户界面(GUI)都内置了支持。AI图像放大工具,如ESRGAN,对于提高由Stable Diffusion生成的AI图像质量至关重要。它们被广泛使用,以至于许…

ArcGIS中快捷添加在线地图

ArcGIS中快捷添加在线地图 1、首先打开这个地址:(https://www.geosceneonline.cn/geoscene/webapps/gallery) 2、选择一个需要的地图服务,点击 在ArcMap 中打开 3、此时会下载一个文件。item.pkinfo 4、双击打开该文件,会默认打开ArcMap并创建空白地图,并将天地图作为底…

PART1-Oracle关系数据结构-索引和索引组织表

3. 索引组织表 3.1. 索引概述 索引是与表或表簇关联的可选结构,有时可以加快数据访问速度。通过在表的一个或多个列上创建索引,在某些情况下,您可以从表中检索一小部分随机分布的行。索引是减少磁盘I/O的众多方法之一。 如果堆组织表没有索引,那么数据库必须执行全表扫描才…

南沙信奥塞陈老师解一本通题:1408:素数回文数的个数

【题目描述】求11到n之间(包括n),既是素数又是回文数的整数有多少个。【输入】一个大于11小于1000的整数n。【输出】11到n之间的素数回文数个数。【输入样例】 23 【输出样例】 1 【提示】提示: 回文数指左右对称的数,如:292,333。 #include <bits/stdc++.h> using…

软件工程第一次随笔作业

这个作业属于哪个课程 首页 - 软件工程2024 - 福州大学 - 班级博客 - 博客园 (cnblogs.com)这个作业要求在哪里 2024秋软件工程个人作业(第一次) - 作业 - 软件工程2024 - 班级博客 - 博客园 (cnblogs.com)这个作业的目标 搭建自己的博客,编辑自己的个人情况学号 102202117一…

脑机接口定义及相关概念

1 什么是脑机接口脑机接口(Brain-Computer Interface,简称,BCI)是指一种系统或设备,它通过解码大脑的电生理信号来与外部计算机或设备进行直接的通讯。BCI的目的是在不依赖身体运动的情况下实现大脑与计算机之间的信息交换。2 相关概念 2.1 脑电图(EEG) 最常用的脑机接口技术之…