【Java多线程】Thread类的基本用法

目录

Thread类

1、创建线程

1.1、继承 Thread,重写run

1.2、实现 Runnable,重写run

1.3、使用匿名内部类,继承 Thread,重写run

1.4、使用匿名内部类,实现 Runnable,重写run

1.5、使用 lambda 表达式(最常用)

2、终止线程

2.1、通过共享的标记来进行沟通

2.2、调用 interrupt() 方法来通知 

3、等待线程

4、获取线程实例

Thread类

 

1、创建线程

线程的创建方法一共有五种,其中lambda表达式的创建方式最为常用,这里简单的给大家介绍一下这五种创建。

1.1、继承 Thread,重写run

class MyThread2 extends Thread {   //创建一个类继承Thread,并重写run@Overridepublic void run() {   System.out.println("hello thread");}
}public class ThreadDemo2 {public static void main(String[] args) {Thread t = new MyThread2();   //创建MyThread类的实例t.start();   //调用start方法启动线程}
}

1.2、实现 Runnable,重写run

Thread(Runnable target),使用runnable对象创建线程对象。

class MyThread3 implements Runnable {   //实现Runnable接口@Overridepublic void run() {System.out.println("hello runnable");}
}public class ThreadDemo3 {public static void main(String[] args) {Runnable runnable = new MyThread3();  //创建runnable对象Thread t = new Thread(runnable);   //将runnable对象作为target参数t.start();   //start启动线程}
}

1.3、使用匿名内部类,继承 Thread,重写run

public class ThreadDemo4 {public static void main(String[] args) {Thread t = new Thread() {   //继承thread类的匿名内部类@Overridepublic void run() {System.out.println("hello thread");}};t.start();}
}

1.4、使用匿名内部类,实现 Runnable,重写run

public class ThreadDemo5 {public static void main(String[] args) {Thread t = new Thread(new Runnable() {   //实现Runnable接口的匿名内部类@Overridepublic void run() {System.out.println("hello runnable");}});t.start();}
}

1.5、使用 lambda 表达式(最常用)

public class ThreadDemo6 {public static void main(String[] args) {Thread t = new Thread(() -> {   //实现Runnable接口重写run的lambda写法【推荐使用】System.out.println("hello thread");});t.start();}
}

2、终止线程

有时我们需要让正在执行的线程终止,为了让线程能够停止,需要添加一些机制。

2.1、通过共享的标记来进行沟通

public class ThreadInterrupt {public static boolean isQuit = false;   //设置标志位isQuit充当控制开关public static void main(String[] args) throws InterruptedException {Thread t = new Thread(() -> {while (!isQuit) {    //控制while终止System.out.println("hello thread");try {Thread.sleep(1000);   //让每个打印间隔1秒} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("线程执行完毕");});t.start();Thread.sleep(3000);   //sleep睡眠3秒后再修改标志位isQuit = true;}
}

2.2、调用 interrupt() 方法来通知 

        使用 Thread.interrupted() 或者 Thread.currentThread().isInterrupted() 代替自定义标识位。

        其中,Thread.currentThread() 表示获取当前线程实例,类似于 this 。而这里没有直接使用this是因为此处的Thread线程使用的是匿名内部类,无法通过this获取当前实例。

        最后使用 interrupt() 进行终止线程。

    public static void main(String[] args) throws InterruptedException {Thread t = new Thread(() -> {while (!Thread.currentThread().isInterrupted()) {System.out.println("hello thread");try {Thread.sleep(1000);   //让每个打印间隔1秒} catch (InterruptedException e) {break;   //注意此处需要添加break,因为sleep会清空interrupted标志位}}System.out.println("线程执行完毕");});t.start();Thread.sleep(3000);   //sleep睡眠3秒后再调用interrupt终止线程t.interrupt();}

3、等待线程

多个线程的执行顺序是不确定的(随机调度,抢占式执行)

虽然线程底层的调度是随机的,但是可以在应用程序中,通过一些api,来影响到线程的调度顺序使用join就是其中一种方式,join()方法可以确定线程的结束顺序

public static void main(String[] args) {Thread t1 = new Thread(() -> {   System.out.println("hello thread1");});Thread t2 = new Thread(() -> {   System.out.println("hello thread2");});t1.start();   //此时t1线程开始执行t1.join();    //等待t1结束后再执行下面代码t2.start();   //此时t2线程开始执行t2.join();    //等待t2结束后再执行下面代码System.out.println("hello main");   //最后执行main主线程中的打印}

【谁调用,谁等待】main方法中调用t.join(),main主线程就阻塞等待t线程结束,再继续执行。

典型的使用场景:
使用多个线程并发进行一系列计算,用一个线程阻塞等待上述计算线程,等到所有的线程都计算完了,最终这个线程汇总结果。

4、获取线程实例

有两种获取线程实例的方法,一种是 this ,另一种是 Thread.currentThread() 。

其中需要注意的是:this不能使用到匿名内部类中,因此匿名内部类只能通过Thread.currentThread() 来获取实例。

class MyThread extends Thread {@Overridepublic void run() {System.out.println("MyThread :"+this.getName());   //使用this直接获取实例}
}
public class GetThread {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {Thread thread = Thread.currentThread();   //匿名内部类中通过currentThread获取实例System.out.println("t1线程中: "+thread.getName());});Thread t2 = new MyThread();t1.start();t1.join();t2.start();}
}

 

 

【博主推荐】 

对进程与线程的理解-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zzzzzhxxx/article/details/136115808?spm=1001.2014.3001.5501【数据结构】二叉树的三种遍历(非递归讲解)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zzzzzhxxx/article/details/136044643?spm=1001.2014.3001.5501【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zzzzzhxxx/article/details/136030138?spm=1001.2014.3001.5501

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

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

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

相关文章

基于四叉树的图像分割算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ........................................................... Imgs(dx 1 : dx R1, dy 1 …

搜索专项---双端队列广搜模型

文章目录 电路维修 一、电路维修OJ链接 本题思路: #include <bits/stdc.h>#define x first #define y secondtypedef std::pair<int,int> PII;constexpr int N510;int n,m; char g[N][N]; int dist[N][N]; bool st[N][N]; std::deque<PII> dq;char cs[] &q…

vscode运行C/C++时候cmd.exe界面显示

写了一些命令行传参的程序&#xff0c;需要终端输入参数&#xff0c;默认是输出结果显示在它自己的终端界面 Code-runner: Run In Terminal 打勾就行 效果&#xff1a;

机器学习2---逻辑回归(基础准备)

逻辑回归是基于线性回归是直线分的也可以做多分类 ## 数学基础 import numpy as np np.pi # 三角函数 np.sin() np.cos() np.tan() # 指数 y3**x # 对数 np.log10(10) np.log2(2) np.e np.log(np.e) #ln(e)# 对数运算 # log(AB) log(A) logB np.log(3*4)np.log(3)np.log(4) #…

【AIGC】Stable Diffusion的采样器入门

在 Stable Diffusion 中&#xff0c;采样器&#xff08;Sampler&#xff09;是指用于生成图像的一种技术或方法&#xff0c;它决定了模型如何从潜在空间中抽样并生成图像。采样器在生成图像的过程中起着重要作用&#xff0c;影响着生成图像的多样性、质量和创造性。以下是对 St…

C++动态规划-线性dp算法

莫愁千里路 自有到来风 CSDN 请求进入专栏 X 是否进入《C专栏》? 确定 目录 线性dp简介 斐波那契数列模型 第N个泰波那契数 思路&#xff1a; 代码测试&#xff1a; 三步问题 思路&#xff1a; 代码测试&#xff1a; 最小花费爬楼梯 思路…

具有集中目录服务器的 P2P 工作方式

P2P 工作方式概述 在 P2P 工作方式下&#xff0c;所有的音频/视频文件都是在普通的互联网用户之间传输。 具有集中目录服务器的 P2P 工作方式 Napster 最早使用 P2P 技术&#xff0c;提供免费下载 MP3 音乐。 Napster 将所有音乐文件的索引信息都集中存放在 Napster 目录服务…

【Pygame手册02/20】pygame模块display控制窗口和屏幕

目录 一、说明二、pygame.display接口函数2.1 函数表格2.2 pygame.display的功能 三、详细的函数调用3.1 pygame.display.init()3.2 pygame.display.quit()3.3 pygame.display.get_init()3.4 pygame.display.set_mode()3.5 pygame.display.get_surface()3.6 pygame.display.fl…

IDEA工程与模块管理

一、IDEA项目结构 层级关系&#xff1a; project(工程) - module(模块) - package(包) - class(类)具体的&#xff1a; 一个project中可以创建多个module一个module中可以创建多个package一个package中可以创建多个class二、Project和Module的概念 在 IntelliJ IDEA 中&…

问题:如果要编辑建好的建筑和空间,需要在分级按钮( )和细分操作按钮楼层下,才能选中建筑物和空间; #微信#媒体#其他

问题&#xff1a;如果要编辑建好的建筑和空间&#xff0c;需要在分级按钮&#xff08; &#xff09;和细分操作按钮楼层下&#xff0c;才能选中建筑物和空间&#xff1b; A、楼层 B、规划图 C、全景 D、建筑物 参考答案如图所示

react 【七】各种hooks的使用/SPA的缺点

文章目录 1、Hook1.1 为什么会出现hook1.2 useState1.3 useEffect1.4 useContext1.5 useReducer1.6 useCallback1.7 useMemo1.8 useRef1.8.1 ref绑定dom1.8.2 ref解决闭包缺陷 1.9 useImperativeHandle1.10 useLayoutEffect1.11 自定义Hook1.11.1 什么是自定义Hook1.11.2 Conte…

用HTML Canvas和JavaScript创建美丽的花朵动画效果

目录 一、程序代码 二、代码原理 三、运行效果 一、程序代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>flower</title><style>* {margin: 0;padding: 0;overflow: hidden;backg…