Java多线程

一、线程的概念

线程:进程内的执行单元,也叫轻量级进程,一个进程可包含多个线程同时执行不同任务。

主线程:从main方法开始执行,以main方法退出为结束,main函数是其执行体。

线程组成

CPU:由操作系统分配时间片;

数据:堆空间共享,栈空间独立(每个线程有专属栈空间);

程序代码。

二、线程的创建方式

方式1:实现Runnable接口

定义类实现java.lang.Runnable接口,并重写run()方法(封装线程任务);

创建目标对象:MyTask task = new MyTask();;

创建线程对象并传入目标对象:Thread t1 = new Thread(task);;

开启线程:t1.start();。

方式2:继承Thread类

定义子类继承java.lang.Thread类,并重写run()方法;

创建线程对象:MyThread t2 = new MyThread();;

开启线程:t2.start();。

三、线程的状态

初始状态(New):线程对象被创建,仅在堆中开辟内存,与常规对象无异。

就绪状态(Ready):调用start()后进入,等待操作系统选中并分配时间片。

运行状态(Running):获得时间片后执行,时间片到期则回到就绪状态。

终止状态(Terminated):run()方法结束,线程任务完成并释放时间片。

计时等待(Timed Waiting):调用sleep(long m)后进入,超时后回到就绪状态。

无计时等待(Waiting):调用join()或等待数据输入时进入,条件满足后回到就绪状态。

阻塞状态(Blocked):获取同步锁失败时进入,获得锁后回到就绪状态。

状态流转关键:

start():New → Ready;

操作系统选中:Ready → Running;

时间片到期:Running → Ready;

sleep()/join():Running → 等待状态;

同步锁竞争失败:Running → Blocked;

run()结束:Running → Terminated。

四、线程的常见方法

休眠:public static void sleep(long m)

让当前线程休眠m毫秒,进入计时等待状态,同时释放CPU资源。

结合:public final void join()

让调用该方法的线程优先执行,当前线程等待其执行完毕后再继续;如main中调用t1.join(),主线程会让步于t1线程。

五、线程同步

线程异步问题

多线程同时操作共享资源(临界资源)时,会出现数据不一致的问题(如多线程向同一数组添加元素,可能出现覆盖、计数错误)。

同步代码块

作用:对临界资源加锁,保证原子操作的执行唯一性。

语法(定义在方法内部):

synchronized(临界资源对象) {

// 原子操作代码

}

相关推荐
octopus_c1 天前
C++ 模板详解:函数模板、类模板、特化与分离编译
开发语言·c++·算法
步行cgn1 天前
Spring MVC 执行流程详解:一次请求的完整旅程
java·spring·mvc
增量星球1 天前
Spring AI 2.0 Tool Calling 到底怎么跑起来的:从 @Tool 到两次模型调用
java·agent·springai·ai coding
步行cgn1 天前
Spring MVC 九大核心角色详解:请求处理链路中的每一个关键组件
java·spring·mvc
智恒百亿1 天前
一台 5090 八卡服务器怎么分给一个团队用?多模型多任务的显存分配实战
java·大数据·人工智能
瑞码空间1 天前
面向接口编程与开闭原则在模拟 JDBC 驱动中的应用
java·jdbc
Félix2511 天前
Nacos学习笔记(SpringBoot/SpringCloud)
java·spring boot·spring
文丑颜不良啊1 天前
LeetCode1581~1600题目解析
java·leetcode
香蕉大香蕉(06敬畏市场)1 天前
MySQL 单点详解(06)
java·数据库·mysql·博客·实习
椒颜皮皮虾྅1 天前
让文档不止于文字:DeploySharp + PP-Structure,打通版面分析与表格重建
开发语言·学习·c#·.net·cuda