【多线程】Thread类的使用

目录

1.概述

2.Thread的常见构造方法

3.Thread的几个常见属性

 4.启动一个线程-start()

5.中断一个线程

5.1通过共享的标记来进行沟通

5.2 调用 interrupt() 方法来通知

6.等待一个进程

 7.获取当前线程引用

8.线程的状态

8.1所有状态

8.2线程状态和转移的意义


1.概述

Thread是jvm用来管理线程的一个类,即,在Java中,每个线程都有一个唯一的Thread对象与之关联。

每个执行流,也需要有一个对象来描述,类似下图所示,而 Thread 类的对象
就是用来描述一个线程执行流的,JVM 会将这些 Thread 对象组织起来,用于线程调度,线程管理

2.Thread的常见构造方法

方法说明
Thread()创建线程对象
Thread(Runnable target)使用 Runnable 对象创建线程对象
Thread(String name)创建线程对象,并命名
Thread(Runnable target, String name)使用 Runnable 对象创建线程对象,并命名

3.Thread的几个常见属性

属性获取方法
IDgetId()
名称getName()
状态getState()
优先级getPriority()
是否后台线程isDaemon()
是否存活isAlive()
是否被中断isInterrupted()

 4.启动一个线程-start()

之前我们已经看到了如何通过覆写 run 方法创建一个线程对象,但线程对象被创建出来并不意味着线程就开始运行了。
覆写 run 方法是提供给线程要做的事情的指令清单线程对象可以认为是把 李四、王五叫过来了
而调用 start() 方法,就是喊一声:”行动起来!“,线程才真正独立去执行了。

调用 start 方法, 才真的在操作系统的底层创建出一个线程.即,run方法是一个行动指南,而真正让这个线程创建并执行出来的,是strat()方法。
 

5.中断一个线程

 对于正在run方法中执行的线程,我们一般有两种方法来中断;

5.1通过共享的标记来进行沟通

 

public class demo3 {public static boolean quit;public static void main(String[] args) throws InterruptedException {Thread t = new Thread(()->{while (!quit){System.out.println("线程在执行...");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();Thread.sleep(5000);System.out.println("结束线程");quit=true;}
}

5.2 调用 interrupt() 方法来通知

public class demo3 {public static void main(String[] args) throws InterruptedException {Thread t = new Thread(()->{while (!Thread.currentThread().isInterrupted()){System.out.println("线程在执行...");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();Thread.sleep(5000);System.out.println("结束线程");t.interrupt();}
}

1. 如果线程因为调用 wait/join/sleep 等方法而阻塞挂起,则以 InterruptedException 异常的形式通
知,清除中断标志,当出现 InterruptedException 的时候, 要不要结束线程取决于 catch 中代码的写法. 可以选择忽略这个异常, 也可以跳出循环结束线程.
2.否则,只是内部的一个中断标志被设置,t可以通过Thread.interrupted() 判断当前线程的中断标志被设置,清除中断标志Thread.currentThread().isInterrupted() 判断指定线程的中断标志被设置,不清除中断标志这种方式通知收到的更及时,即使线程正在 sleep 也可以马上收到。

6.等待一个进程

有时,我们需要等待一个线程完成它的工作后,才能进行自己的下一步工作。这时我们需要一个方法明确等待线程的结束

方法说明
public void join()等待线程结束
public void join(long millis)等待线程结束,最多等 millis 毫秒
public void join(long millis, int nanos)同理,但可以更高精度
import java.util.Random;public class demo1 {public static int tmp1;public static int tmp2;public static void main(String[] args) throws InterruptedException {int[] array = new int[10000000];Random random = new Random();for (int i = 0; i < array.length; i++) {int n = random.nextInt(100);array[i] = n;}long time1 = System.currentTimeMillis();Thread t1 = new Thread(()->{for (int i = 0; i < array.length; i+=2) {tmp1+=array[i];}});Thread t2 = new Thread(() ->{for (int i = 1; i < array.length; i+=2) {tmp2+=array[i];}});t1.start();t2.start();t1.join();t2.join();System.out.println("数组中的随机数总和="+(tmp1+tmp2));long time2 = System.currentTimeMillis();System.out.println("程序运行时间=" + (time2-time1)+"ms" );}
}

如果把这两个join注释的话:

 7.获取当前线程引用

方法说明
public static Thread currentThread();返回当前线程对象的引用
 public static void main(String[] args) {Thread t = Thread.currentThread();System.out.println(t.getName());}

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

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

相关文章

Relabel与Metic Relabel

Prometheus支持多种方式的自动发现目标&#xff08;targets&#xff09;&#xff0c;以下是一些常见的自动发现方式&#xff1a; 静态配置&#xff1a;您可以在Prometheus配置文件中直接列出要监测的目标。这种方式适用于目标相对稳定的情况下&#xff0c;例如固定的服务器或设…

HCIA-RS基础:动态路由协议基础

摘要&#xff1a;本文介绍动态路由协议的基本概念&#xff0c;为后续动态路由协议原理课程提供基础和引入。主要讲解常见的动态路由协议、动态路由协议的分类&#xff0c;以及路由协议的功能和自治系统的概念。文章旨在优化标题吸引力&#xff0c;并通过详细的内容夯实读者对动…

自求导的方法实现线性回归算法

线性回归是一种常用的回归算法&#xff0c;用于建立输入变量和连续输出变量之间的关系。传统的线性回归算法通常依赖于繁琐的数学推导和梯度计算。但是&#xff0c;随着深度学习的兴起&#xff0c;自求导的方法逐渐成为实现线性回归算法的有效途径。本文将介绍如何使用自求导的…

视频网站适合租用服务器吗?

视频网站适合租用服务器吗&#xff1f; 谈到服务器租用&#xff0c;在服务器租用市场中&#xff0c;通常比较常见的用户群体有电商、外贸和视频等网站。在这里相信很多用户都有疑问&#xff1a;租用的服务器适不适合用来建立视频网站呢&#xff1f;接下来我们一起来看看吧~ 首…

VMware安装windows操作系统

一、下载镜像包 地址&#xff1a;镜像包地址。 找到需要的版本下载镜像包。 二、安装 打开VMware新建虚拟机&#xff0c;选择用镜像文件。将下载的镜像包加载进去即可。

python opencv 边缘检测(sobel、沙尔算子、拉普拉斯算子、Canny)

python opencv 边缘检测&#xff08;sobel、沙尔算子、拉普拉斯算子、Canny&#xff09; 这次实验&#xff0c;我们分别使用opencv 的 sobel算子、沙尔算子、拉普拉斯算子三种算子取进行边缘检测&#xff0c;然后后面又使用了Canny算法进行边缘检测。 直接看代码&#xff0c;代…

论文导读 | 10月专题内容精选:人的预测

编者按 本次论文导读&#xff0c;编者选择了10月份OR和MS上与"人的预测"有关的三篇文章&#xff0c;分别涉及群体智慧的提取&#xff0c;个体序列预测的评估&#xff0c;以及决策者对风险的扭曲感知在分布式鲁棒优化中的应用。其中&#xff0c;从基于"生成式可能…

Django框架之csrf跨站请求

目录 一、csrf跨站请求伪造详解 二、csrf跨域请求伪造 【1】正常服务端 【2】钓鱼服务端 三、csrf校验 【介绍】 form表单中进行csrf校验&#xff1a; 【1】form表单如何校验 【2】ajax如何校验 四、csrf相关装饰器 【1】csrf_protect装饰器&#xff1a; 【…

使用VUE3实现简单颜色盘,吸管组件,useEyeDropper和<input type=“color“ />的使用

1.使用vueuse中的useEyeDropper来实现滴管的功能和使用input中的type"color"属性来实现颜色盘 效果&#xff1a; 图标触发吸管 input触发颜色盘 组件代码部分 &#xff1a;<dropper> ---- vueuse使用 <template><div class"sRGBHexWrap fbc…

【Python百宝箱】第三维度的魔法:探索Python游戏世界

Python在游戏开发中的魔力 前言 游戏开发一直是计算机科学中最引人入胜和具有挑战性的领域之一。随着技术的不断进步&#xff0c;开发者们寻找着更快、更灵活的工具来实现他们的创意。在这个探索的过程中&#xff0c;Python以其简洁、易学和强大的特性成为了游戏开发的热门选…

C#每天复习一个重要小知识day4:枚举的概念/申明/使用

目录 1.枚举的概念&#xff1a; 2.申明枚举和申明枚举变量&#xff1a; 申明枚举语法&#xff1a; 申明枚举变量语法&#xff1a; 1.枚举的概念&#xff1a; 枚举是什么&#xff1f;枚举是一个比较特别的存在&#xff0c;它是一个命名的整形常量的集合&#xff0c;一般用它…

Flume采集Kafka并把数据sink到OSS

安装环境 Java环境, 略 (Flume依赖Java)Flume下载, 略Scala环境, 略 (Kafka依赖Scala)Kafak下载, 略Hadoop下载, 略 (不需要启动, 写OSS依赖) 配置Hadoop 下载JindoSDK(连接OSS依赖), 下载地址Github 解压后配置环境变量 export JINDOSDK_HOME/usr/lib/jindosdk-x.x.x expo…

AWS CLI和EKSCTL的客户端设置

文章目录 小结过程安装AWS CLI安装EKSCTL在两个Kubernetes Cluster之间切换 参考 小结 在Linux环境中对AWS CLI和EKSCTL的客户端进行了设置。 过程 安装AWS CLI 使用以下指令安装&#xff1a; curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip"…

Qt实现绘制自定义形状

先创建一个继承自QWidget的控件&#xff1a; class MyPainterWidget:public QWidget 重写各种鼠标方法&#xff1a; protected:void paintEvent(QPaintEvent *) override;void mousePressEvent(QMouseEvent *e) override; //按下void mouseMoveEvent(QMouseEvent *e) …

Xposed hook失败的原因

最近对Xposed的比较感兴趣&#xff0c;于是照着网上的给的例子做了一个Xposed模块&#xff0c;但是在安卓模拟器上死活不生效&#xff0c;最后研究发现了两个问题导致&#xff1a; 1、XposedBridgeAPI-89.jar 需要放到项目的lib目录下&#xff0c;而不是libs目录 2、XposedBr…

HEVC-SCC rgb file input

关键字 csc allocateCSCBuffer&#xff08;&#xff09;-> m_apcPicYuvCSC xCheckRDCostIntraCSC():更简单&#xff0c; enum ACTRDTestTypes { ACT_TWO_CLR 0, //two color space ACT_TRAN_CLR 1, //transformed color space ACT_ORG_CL…

补充:如何提高selenium的运行速度?

已经通读该专栏文章的同学,或许对UI自动化测试有了一定的掌握,细心的同学肯定会发现一个问题,当用例量达到一定程度时,对于整体用例的执行速度肯定不会很满意。除了应用多线程运行用例的方式加快速度,有没有其他的方法呢? 今天告诉大家,方法是有的!也是本人新学的。即…

[PyTorch][chapter 66][强化学习-值函数近似]

前言 现实强化学习任务面临的状态空间往往是连续的,无穷多个。 这里主要针对这种连续的状态空间处理。后面DQN 也是这种处理思路。 目录&#xff1a; 1&#xff1a; 原理 2&#xff1a; 梯度更新 3&#xff1a; target 和 预测值 4 流程 一 原理 强化学习最重要的是得到 …

c++版本opencv计算灰度图像的轮廓点

代码 #include<iostream> #include<opencv.hpp>int main() {std::string imgPath("D:\\prostate_run\\result_US_20230804_141531\\mask\\us\\104.bmp");cv::Mat imgGray cv::imread(imgPath, 0);cv::Mat kernel cv::getStructuringElement(cv::MORPH…

任意分圆环下的 RLWE:如何产生正确的噪声分布

参考文献&#xff1a; [Con09] Conrad K. The different ideal[J]. Expository papers/Lecture notes. Available at: http://www.math.uconn.edu/∼kconrad/blurbs/gradnumthy/different.pdf, 2009.[LPR10] Lyubashevsky V, Peikert C, Regev O. On ideal lattices and learn…