java并发编程之线程基础

server/2024/9/24 12:24:53/

文章目录

  • 线程基础
    • 线程状态
      • New(新创建)
      • Runnable(可运行)
      • 被阻塞线程和等待线程
      • Terminated(终止)
    • 三种使用线程的方法
    • 线程互斥同步
      • Synchronized
        • 概念
        • 修饰的四种对象
      • ReentrantLock
      • 比较

线程基础

线程状态

线程可以有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 方法而意外死亡

三种使用线程的方法

  • 实现 Runnable 接口;
  • 实现 Callable 接口;
  • 继承 Thread 类。
    参考文章:Java创建线程的三种方式

线程互斥同步

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

Synchronized

概念

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

修饰的四种对象

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

ReentrantLock

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

比较

在这里插入图片描述


http://www.ppmy.cn/server/102824.html

相关文章

网络编程/在哪些场景中不必要进行网络字节序转换? Windows Sockets: Byte Ordering

文章目录 概述字节序必须转换字节序的的情况不必转换字节序的的情况字节序转换的例程字节序转换函数字节序转换可以不生硬字节序和位序 概述 本文主要讲述了在哪些场景下必须要进行大小端字节序转换,在哪些场景下可以不用进行大小端字节序转换,IP和端口…

【ubuntu24.04】k8s 部署6:calico容器正常启动

参考大神 以及 tigera官方的calico 教程:拥有一个带有 Calico 的单主机 Kubernetes 集群 后, 【k8s】配置calico 1: 镜像拉取 【k8s】master节点重新安装docker-ce 本文进一步解决容器启动问题: 非常感谢大神的指点:准备 Kubernetes 集群环境 做好了各种配置以后,kube**的…

encoding with ‘idna‘ codec failed (UnicodeError: label empty or too long)

今天在使用Flask连接mysql的时候,遇到了一个报错:encoding with ‘idna’ codec failed (UnicodeError: label empty or too long) 网上查了一下说是字符集的问题,然后尝试修改了一下字符集,结果还是不行。 最后去翻阅SQLAlchemy…

idea付费插件,这个插件Laravel idea好用吗

以下idea付费插件你们都用过哪些呢? 获取链接:https://web.52shizhan.cn

分类预测|基于白鲸优化混合核极限学习机结合Adaboost的数据分类预测Matlab程序BWO-HKELM-Adaboost

分类预测|基于白鲸优化混合核极限学习机结合Adaboost的数据分类预测Matlab程序BWO-HKELM-Adaboost 文章目录 前言分类预测|基于白鲸优化混合核极限学习机结合Adaboost的数据分类预测Matlab程序BWO-HKELM-Adaboost 一、BWO-HKELM-Adaboost模型1. 模型组成1.1 白鲸优化算法&#…

LeetCode面试题Day12|LC209 长度最小的子数组、LC30 串联所有单词的子串

题目一: 指路: . - 力扣(LeetCode)209 长度最小的子数组 思路与分析: 滑动窗口,目的在于降低算法的时间复杂度,每次只维护一定长度的数组而非原数组的全部元素。那么既然需要长度&#xff0…

xss.pwnfunction-Easy

目录 Ma Spaghet 代码 payload构造 结果 Jefff 代码 payload构造 方法一 方法二 结果 方法一 方法二 Ugandan Knuckles 代码 payload构造 结果 Ricardo Milos 代码 payload构造 结果 Ah Thats Hawt 代码 payload构造 结果 Ligma 代码 payload构造 结果…

华为 OLT 添加 ONT 配置 (OMCI 管理模式)

OMCI管理模式型ONT配置 ONT上网业务数据规划 OLT PON端口 0/8/0 ONT ID 0 ONT 序列号 48575443D659FD40 外层 VLAN ID 2012 内层VLAN ID 35 用户ETH端口 1 用户VLAN 35 DBA带宽类型 type 2 流量模板 10 业务上行口 0/9/0 DBA 模板编号 30 ONT线路模板编号 40 ONT业务模板…