java并发编程之线程基础

文章目录

线程基础

线程状态

线程可以有6种状态

  • New(新创建)
  • Runnable(可运行)
  • Blocked(被阻塞)
  • Waiting(等待)
  • Timing Waiting(计时等待)
  • Terminated(终止)

New(新创建)

当使用new操作符新创建一个新线程时,如 new Thread®,该线程还没有开始运行。在线程运行前还有一些准备工作要做。

Runnable(可运行)

一旦调用 start 方法,线程处于 Runnable 状态。

可能正在运行,也可能正在等待 CPU 时间片。

包含了操作系统线程状态中的 Running 和 Ready。

被阻塞线程和等待线程

当线程处于被阻塞状态或等待状态时,它暂时不活动。它不运行任何代码且消耗最少的资源,直到线程调度器重新激活它;细节取决于它是怎样到达非活动状态的。

  • 当一个线程试图获取一个内部的对象锁(而不是java.util.concurrent库中的锁),而该锁被其他线程持有,则该线程进入阻塞状态。当所有其他线程释放该锁,并且线程调度器允许本线程持有它时,该线程将变成非阻塞状态。
  • 当一个线程等待另一个线程通知线程调度器一个条件时,它自己进入等待状态。在调用 Object.wait 方法或 Thread.join 方法,或是等待 java.util.concurrent 库中的 Lock 或 Condition 时,就会出现这种情况。
进入方法 退出方法
没有设置 Timeout 参数的 Object.wait() 方法 Object.notify() / Object.notifyAll()
没有设置 Timeout 参数的 Thread.join() 方法 被调用的线程执行完毕
LockSupport.park() 方法
  • 有几个方法有一个超时参数。调用他们导致线程进入计时等待,这一状态将一直保持到超时期满或者接收到适当的通知。带有超时参数的方法有 Thread.sleep、Object.join、Thread.join、Lock.tryLock 以及 Condition.await 的计时版。
进入方法 退出方法
Thread.sleep() 方法 时间结束
设置了 Timeout 参数的 Object.wait() 方法 时间结束 / Object.notify() / Object.notifyAll()
设置了 Timeout 参数的 Thread.join() 方法 时间结束 / 被调用的线程执行完毕
LockSupport.parkNanos() 方法 -
LockSupport.parkUntil() 方法 -

Terminated(终止)

线程因如下两个原因之一而被终止:

  • 因 Run 方法正常退出而正常死亡
  • 因一个没有捕获的异常终止了 run 方法而意外死亡

三种使用线程的方法

线程互斥同步

参考文章

Java 提供了两种锁机制来控制多个线程对共享资源的互斥访问,第一个是 JVM 实现的 synchronized,而另一个是 JDK 实现的 ReentrantLock。

Synchronized

概念

是 java 中的关键字,它可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入临界区,同时它还可以保证共享变量的内存可见性。

修饰的四种对象

参考文章-修饰的四种对象

ReentrantLock

ReentrantLock 是 java.util.concurrent(J.U.C)包中的锁。

比较

相关推荐
qmx_0727 分钟前
HTB-Jerry(tomcat war文件、msfvenom)
java·web安全·网络安全·tomcat
为风而战36 分钟前
IIS+Ngnix+Tomcat 部署网站 用IIS实现反向代理
java·tomcat
编程零零七2 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
技术无疆3 小时前
快速开发与维护:探索 AndroidAnnotations
android·java·android studio·android-studio·androidx·代码注入
2401_858286113 小时前
52.【C语言】 字符函数和字符串函数(strcat函数)
c语言·开发语言
铁松溜达py3 小时前
编译器/工具链环境:GCC vs LLVM/Clang,MSVCRT vs UCRT
开发语言·网络
everyStudy3 小时前
JavaScript如何判断输入的是空格
开发语言·javascript·ecmascript
C-SDN花园GGbond4 小时前
【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)
c语言·开发语言·数据结构·排序算法
迷迭所归处5 小时前
C++ —— 关于vector
开发语言·c++·算法
架构文摘JGWZ6 小时前
Java 23 的12 个新特性!!
java·开发语言·学习