线程常用方法及常见状态
创始人
2024-05-15 19:20:37
0

终止线程

应该怎么终止一个线程呢?

  1. 当线程完成任务时。

  1. 通过使用变量来控制run方法退出的方式停止线程,即通知方式。

这里详细介绍一下2的方式。

在A线程依靠变量循环跑的过程ing,主线程通过修改A线程的变量,来控制线程终止。

为A线程中的变量设置set方法,来修改掉循环条件,从而让run方法走向结束。

所以在A线程想要B线程退出怎么办呢?

在A线程中通知B线程,控制B线程的变量,通知它退出即可。


线程常用方法

  1. 设置名称 get,setName

  1. 设置优先级 get,setPriority

  1. 中断线程 interrupt(不会真正结束线程,所以一般用于中断正在休眠线程)

  1. 调用线程 start,run

  1. 线程礼让 yield静态方法(让出CPU,让其他线程执行,不一定礼让成功)

  1. 线程插队 join(一旦A线程插队成功,则先执行完A线程所有,再继续执行B线程剩下的,相当于阻塞B线程)


线程守护

  1. 用户线程(工作线程):普通线程

  1. 守护线程:所有用户线程结束,守护线程自动退出(GC机制)

怎么把一个普通线程变成守护线程?

线程名称.setDaemon(true);

先设置完守护线程,再start方法启动。


线程的7个状态

(此图源于韩顺平老师B站课程)


线程同步机制

在多线程编程中,有一些敏感数据不应该被多个线程同时访问,此时应该使用同步访问技术,保证数据在任何时刻,最多只能有一个线程访问,保证数据的完整性。

同步具体方法:Synchronized(也可以称之为互斥锁)

非静态同步方法的锁对象默认是this,也可以是其他对象(要求是同个对象)。

静态同步方法的锁对象默认为当前类.class。

步骤

  1. 分析需要上锁代码

  1. 选择同步代码块或同步方法(尽量为同步代码块,范围小,效率高)

  1. 要求多个线程锁的对象为同一个即可!


线程死锁

线程之间都占用了对象的锁资源,需要互相返回值才肯相让,才导致了死锁。

举个栗子:

两个人打架。

小明:你先松开手,我再松开

我:你先松开手,我才松开

(此图源于韩顺平老师B站课程)


释放锁

以下操作会释放锁:

  1. 当前线程的同步方法,同步代码块执行完毕

  1. 当前线程的同步方法,同步代码块遇到break,return

  1. 当前线程的同步方法,同步代码块出现异常

  1. 当前线程的同步方法,同步代码块执行线程对象的wait方法,当前线程暂停,并释放锁

以下操作不会释放锁:

  1. 调用Thread.sleep方法,Thread.yield方法暂停当前线程的执行(休眠多久,外面的线程就会等多久)

2.其他线程调用了该线程的suspend方法将该线程挂起(suspend和resume方法已被废弃)

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...