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(临界资源对象) {

// 原子操作代码

}

相关推荐
weixin_440784111 天前
【HandlerThread实现原理】
android·java·开发语言
天空'之城1 天前
C 语言工业级通用组件手写 24:互补滤波
c语言·开发语言·互补滤波·嵌入式算法·工业级组件
leoZ2311 天前
本地跑大模型实战(七):llama.cpp 性能调优,让推理更快更省
java·人工智能·spring·生成对抗网络·语言模型·自然语言处理·llama
XR1234567881 天前
工厂车间无线网络方案对比:AGV漫游哪家强?
开发语言·php
傻啦嘿哟1 天前
某短视频平台视频爬虫实战:抓取推荐流视频信息,绕过反爬的3种技巧
开发语言·爬虫·python
現実君1 天前
【硬件进阶】AD22上位替换JLEDA教程
开发语言·php
mubei-1231 天前
SpringDAO的用法
java·开发语言·数据库
happymagic1 天前
java spring boot做的jar包程序,如何实现自动运行启动
java·运维·服务器·spring boot·jar
格林威1 天前
多相机微秒级对齐:硬件触发 vs PTP(IEEE 1588)方案实战对比
开发语言·人工智能·数码相机·机器学习·计算机视觉·视觉检测·机器视觉
都叫我大帅哥1 天前
给 Java 程序员的 CSRF 攻击详解:从原理到防御实战
java