Java-Thread知识点汇总

news2024/11/25 13:55:26

什么是线程

      记得小时候的电脑老是很卡,打开一个浏览器、游戏啥的老是卡死,关又关不掉,然后就会打开任务管理器,强制关闭它

 我们可以看到,这个叫“进程”,简单理解一下,进程就是由(一个或多个)线程组成的,线程是操作系统进行运算调度的最小单位(进程是系统分配资源的基本单位)

进程和线程都是为了处理并发编程!线程是轻量级的进程
进程创建和销毁效率较低(需要分配资源),而线程弥补了该缺点!,
进程具有独立性,每个进程会有自己的虚拟空间,一个进程挂了不会影响另一个进程,
一个进程中的线程之间可能会互相影响,一个线程挂了甚至导致进程奔溃!!!

创建线程的n种方法


(首先我们的main函数就是一个线程)

线程的创建都是围绕着Thread实例的创建展开的

创建一个重写了run方法的的Thread子类

class MyThread extends Thread{
	@Override
	public void run() {
		System.out.println("我是线程");
	}
}
public class Main {	
	 public static void main(String[] args){
              MyThread thread = new MyThread();
              thread.start();
	    }
}

1.这个run方法里面就是线程要做的业务‘

2.调用这个start才开始创建线程,只是实例化是不会创建的

创建一个实现Runnable接口的类

class MyThread implements Runnable{
	@Override
	public void run() {
		System.out.println("我是线程");
	}
}
public class Main {	
	 public static void main(String[] args){
              Thread thread = new Thread(new MyThread());
              thread.start();
	    }
}

看这个和上一个方法的区别,上个方法直接实例化了MyThread而这个方法是实例化Thread然后把MyThread作为参数

匿名内部类

public class Main {	
	 public static void main(String[] args){
              Thread thread = new Thread() {
            	  @Override
            		public void run() {
            			System.out.println("我是线程");
            		}
              };
              thread.start();
	    }
}

内部类的方式实现方法一

实现Runnable的匿名内部类作为参数

public class Main {	
	 public static void main(String[] args){
              Thread thread = new Thread(new Runnable() {
				
				@Override
				public void run() {
					System.out.println("我是线程");
				}
			});
              thread.start();
	    }
}

用内部类的形式完成了方法二

Lamada

public class Main {	
	 public static void main(String[] args){
              Thread thread = new Thread(()->{
            	  System.out.println("太方便拉!");
              });
              thread.start();
	    }
}

推荐使用实现Runnable的接口方法,实现了代码之间的解耦合,你看如果用方法一的话,只能用实例化MyThread的方式创建线程,也就是说必须要把所有线程的业务代码都塞在这一个类中,而重写Runnable在创建线程的时候可以用多种实现Runnable的接口的类作为参数,不一定要把代码塞在一个类里面

Thread的三种构造方法

无参数的

Thread()   就像方法二(匿名内部类实现)

以Runnable实例为参数

Thread(new Runnable())

字符串参数

Thread(String name)  用来重命名线程

Thread的重要方法 

start()

创建线程 如果没有start线程就不会创建

run()

描述线程的业务

interrupt()

中断线程

join()

等待线程

加入在t2中调用t1.join()  就是说在t1完成后 才继续执行t2 

getstate()

获取线程状态

new:

此时java只把线程业务写好,创建了线程对象,但没有执行start方法,也就是还没有创建对应的线程!

runnable:

对应已经调用了start方法的状态(分为正在工作 可工作 即将工作)

terminate:

对应着线程以及结束,但是这个线程实例还在,(要不也调用不了方法不是)

blocked

正在等待锁,后面synchronized细说

waiting(无线等待)

一个正在无限期等待另一个线程执行一个唤醒动作的线程(wait造成的)

time-waiting(定时等待)

一个正在限时等待另一个线程执行一个唤醒动作的线程(sleep或者获得锁对象后wait)

Thread.sleep()/sleep() 

Thread.sleep()静态方法,当前线程进入休眠状态,里面可以输入参数(单位ms)

sleep() 比如t1.sleep()  线程t1休眠 里面可以输入参数(单位ms)

Thread.interrupted()

静态方法,测试线程是否中断

Thread.currentThread()

静态方法,返回当前线程实例

关于线程中断 

线程中断 就是结束当前线程,手动中断线程有两种方法

1.手动设置标志位

public class Main {	
	 public static void main(String[] args){
		      boolean isQuit = false;
              Thread thread = new Thread(()->{
            	 if(!isQuit) {
            		 System.out.println("yes!!!");
            	 }
              });
              thread.start();
	    }
}

2.用interrupt()的方式

用interrupt要注意 如果是sleep状态的线程调用interrupt会报异常

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

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

相关文章

入河排污口设置论证报告书如何编制?入河排污口水质影响预测方法有哪些

随着水资源开发利用量不断增大,全国废污水排放量与日俱增,部分河段已远远超出水域纳污能力。近年来,部分沿岸入河排污口设置不合理,超标排污、未经同意私设排污口等问题逐步显现,已威胁到供水安全、水环境安全和水生态安全&#x…

Bootstrap开发之——Bootstrap简介(01)

一 概述 Bootstrap概念学习前需要具备知识查阅Bootstrap文档Bootstrap各版本有什么不同 二 Bootstrap概念 Bootstrap是一个使用HTML、CSS和JavaScript框架的前端开发框架Bootstrap 是全球最受欢迎的前端框架,用于构建响应式、移动设备优先的网站简洁、直观、强悍的…

Linux-基础指令-3

时间相关的指令 date显示 date 指定格式显示时间: date %Y:%m:%d 例子: 而上述中的 %Y %m %d 等等这些中间可以用很多的符号来分割, 如:" - " " _ " " : " 等等这些都是可以的,但是…

5月份了,不会还有人没找到工作吧.....

前两天跟朋友感慨,去年的铜九铁十、裁员、疫情导致好多人都没拿到offer!现在都已经5月了,金三银四都结束一段时间了。 金三银四都已经结束,大部分企业也招到了自己需要的人,但是我看我的读者们还是有很大一部分人在抱…

算法套路十六——DP求解最长递增子序列LIS

算法示例:LeetCode300. 最长递增子序列 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] …

品优购项目学习记录02-main主体盒子搭建,推荐模块

文章目录 一、main主体盒子搭建1.1 newsflash新闻快报模块1.1.1 news新闻模块1.1.2 lifeservice生活服务模块1.1.3 bargain模块 二、推荐模块 一、main主体盒子搭建 1.main盒子宽度为980像素,位置距离左边220px(margin-left),给高度就不用清除浮动 2.mai…

桂院校园导航小程序 云开发项目 二次开发教程 1.0.1

Gitee代码仓库:桂院校园导航小程序 GitHub代码仓库:GLU-Guide 先 假装 大伙都成功安装了云开发项目,并能在 微信开发者工具 和 手机 上正确运行。 接着就是 将项目 改成自己的学校。 代码里的注释我就不说明了,有提到 我的学校…

vue 引入图片的问题

文章目录 为什么使用require自己讲解实例 - src下 - img验证 实例 - public下 - 绝对路径 - img报错,其中 imgurl5、imgurl6 找不到资源!个人猜想: 去掉 imgurl5、imgurl6 再次运行(开发环境):去掉 imgurl5…

EF Core Build failed. Use dotnet build to see the errors.

Build failed. Use dotnet build to see the errors. 今天学习abp框架用到EF Code First时,报出上述错误。 在网上查了很多资料。 dotnet build D:\Practice\abp\SourceCode\BookStore\src\Acme.BookStore.EntityFrameworkCore\Acme.BookStore.EntityFrameworkCor…

Stable Diffusion webui安装使用

参考: https://stability.ai/blog/stable-diffusion-public-release https://github.com/AUTOMATIC1111/stable-diffusion-webui 安装(6g显存) 1、conda创建python 3.10.6环境 conda create -n stable-diffusion pythonpython 3.10.6 也安装…

【axios】axios的完整配置

注意:本文实例化为TS版 1、axios概念 axios 是一个基于 promise 封装的网络请求库,它是基于 原生XHR 进行二次封装,可以说是 XHR 的一个子集,而 XHR 又是 Ajax 的一个子集 特点 从浏览器中创建 XMLHttpRequests从 node.js 创建…

C/CPP安装pthread教程;#include<pthread.h>无法引入该文件的解决方法;引入pthread后报错

在开发c及cpp的多并发程序时,常常会用到pthread.h头文件,但是pthread是需要自行安装的,下面就是在Windows平台使用Visual Studio安装pthread的教程。 1.下载并解压pthread库 在POSIX Threads for Windows - Browse Files at SourceForge.ne…

Unity 四元数

前言:在场景中,可以用旋转工具改变物体角度,也可以在Inspector窗口中改变物体的X、Y、Z值(欧拉角)来改变物体角度。 虽然用欧拉角表示角度和旋转,但一般人想不到,物体在三维空间的旋转并不是一…

TouchGFX开发(3)----触摸屏幕组件点亮LED

TouchGFX开发.3----触摸屏幕组件点亮LED 概述生成例程配置时钟树开启调试接口移植SSD1306配置调试开启TouchGFX设置屏幕刷新率配置TouchGFXTouchGFX代码配置编译实际效果 概述 TouchGFX是一种先进的软件框架,用于开发嵌入式图形界面(GUI)。借助其特性,…

一个非奇异快速终端滑模控制(NTSM)实例及仿真

一、被控对象 考虑这么一个被控对象 J θ ( t ) u ( t ) d ( t ) J \ddot\theta(t) u(t) d(t) Jθ(t)u(t)d(t) 其中&#xff0c; J J J 为转动惯量&#xff0c; θ \theta θ 为角度&#xff0c; u u u 为控制量&#xff0c; d d d 为扰动&#xff0c;且 d ( t ) < …

vue diff算法与虚拟dom知识整理(7) 根据init.ts源码简单梳理patch都做了些什么

之前我们也见证了 diff算法 的强大 但他 只有确认是同一个节点才做对比 如果不是就直接暴力拆卸了 我们打开我们的案例 找到 node_modules 下面的snabbdom/src下面的 init.ts文件 init.ts 拉到最下面 我们就可以看到这个返回的patch函数 patch相比于他的功能 代码算比较少的…

LeetCode高频算法刷题记录1

文章目录 1. 无重复字符的最长子串【中等】1.1 题目描述1.2 解题思路1.3 代码实现 2. 反转链表【简单】2.1 题目描述2.2 解题思路2.3 代码实现 3. LRU 缓存【中等】3.1 题目描述3.2 解题思路3.3 代码实现 4. 数组中的第K个最大元素【中等】4.1 题目描述4.2 解题思路4.3 代码实现…

吴恩达OpenAI最新课程:prompt-engineering-for-developers读书笔记

文章目录 一、前言二、Prompt编写原则2.1 环境配置2.2 编写清晰、具体的指令2.2.1 使用分隔符2.2.2 结构化输出&#xff08;JSON、HTML等&#xff09;2.2.3 要求模型检查条件是否满足2.2.4 提供少量示例&#xff08;Few-shot Prompting&#xff09; 2.3 指导模型思考2.3.1 指定…

未来工业维护:探索数据分析与机器学习的融合之路

随着工业领域相关技术的不断发展&#xff0c;预测性维护作为一种先进的维护策略&#xff0c;正日益受到企业的重视。预测性维护的核心目标是通过准确预测设备故障的发生时间&#xff0c;实现及时维护和优化生产效率。而在实现这一目标的过程中&#xff0c;数据分析和机器学习的…

FreeRTOS:任务状态和信息查询

目录 一、任务相关 API函数预览二、任务相关API函数详解2.1uxTaskPriorityGet()2.2vTaskPrioritySet()2.3uxTaskGetSystemState() ※※※※※2.4vTaskGetInfo() ※※※※※2.5xTaskGetApplicationTaskTag()2.6xTaskGetCurrentTaskHandle()2.7xTaskGetHandle()2.8xTaskGetIdleTa…