多线程基本常识

多线程的状态

    在Java中,一个线程的生命周期有以下几种状态:

  1. 新建(New):当线程对象被创建时,线程处于新建状态。此时线程对象存在,但还没有调用start()方法启动线程。

  2. 运行(Runnable):当线程调用start()方法后,线程进入就绪状态,等待被分配CPU时间片执行。当线程获取到CPU时间片后,线程进入运行状态执行任务。

  3. 阻塞(Blocked):线程在执行过程中,可能会因为某些原因(如等待I/O操作、等待获取锁等)而暂时停止执行。此时线程进入阻塞状态,等待特定条件满足后重新进入就绪状态。

  4. 等待(Waiting):线程在执行过程中,可能会因为调用了wait()方法而进入等待状态。此时线程释放持有的锁,并等待其他线程调用notify()、notifyAll()方法唤醒自己。

  5. 超时等待(Timed Waiting):线程在执行过程中,可能会因为调用了sleep()方法或者带有超时参数的wait()方法而进入超时等待状态。超过指定时间后,线程会被自动唤醒并进入就绪状态。

  6. 终止(Terminated):线程执行完任务或者发生异常导致线程终止时,线程进入终止状态。

线程的状态之间的流转如下:

  1. 新建 -> 运行:调用start()方法启动线程,线程进入就绪状态等待CPU调度。

  2. 运行 -> 阻塞:线程在执行过程中,由于某些原因(如等待I/O操作、等待获取锁等)暂停执行。

  3. 阻塞 -> 运行:阻塞状态解除后,线程重新进入就绪状态等待CPU调度。

  4. 运行 -> 等待:线程调用了wait()方法,线程进入等待状态。

  5. 等待 -> 运行:其他线程调用了notify()、notifyAll()方法,或者等待时间到达,线程被唤醒并进入就绪状态。

  6. 运行 -> 超时等待:线程调用了sleep()方法或者带有超时参数的wait()方法,线程进入超时等待状态。

  7. 超时等待 -> 运行:超时等待时间到达,线程被自动唤醒并进入就绪状态。

  8. 运行 -> 终止:线程执行完任务或者发生异常导致线程终止。

启动线程方法 start()和 run()区别

     start()和run()是Java中用于启动线程的两种方法。

start()方法用于启动一个新的线程,并在新的线程中执行run()方法。当start()方法被调用时,会创建一个新的线程,并且该线程会执行run()方法中的代码。

run()方法定义了线程的主体,包含了线程要执行的代码。当run()方法被调用时,会在当前线程中执行run()方法中的代码,而不会创建新的线程。

所以,区别在于start()方法会创建一个新的线程,而run()方法只是在当前线程中执行run()方法中的代码。一般情况下,应该使用start()方法来启动线程,这样可以实现多线程并发执行。使用run()方法启动线程,相当于在当前线程中顺序执行run()方法中的代码,不会实现多线程的效果。

线程中的 wait()和 sleep()方法区别

    

wait()方法和sleep()方法都是线程中的方法,但是它们的功能和使用方式有所不同。

  1. wait()方法:
  • wait()方法是Object类中的方法,需要在同步代码块或同步方法中使用。当一个线程调用对象的wait()方法时,该线程会释放对象的锁,并进入等待状态,直到其他线程调用同一个对象的notify()或notifyAll()方法来唤醒等待中的线程。
  • wait()方法的调用可以帮助线程间的协调合作,允许线程之间等待某个条件满足后再继续执行。
  • wait()方法必须在synchronized块中调用,否则会在运行时抛出IllegalMonitorStateException异常。
  1. sleep()方法:
  • sleep()方法是Thread类的静态方法,用于暂停当前线程的执行一段时间,不释放当前线程所持有的锁。
  • sleep()方法的调用不需要在同步代码块或同步方法中,任何地方都可以调用。
  • sleep()方法可以用来模拟线程间的时间间隔,或者在某些需要睡眠一段时间的情况下使用。

多线程同步方法

  1. synchronized关键字:通过在方法或代码块前加上synchronized关键字,可以实现对方法或代码块的同步。一次只能有一个线程访问该同步方法或代码块,其他线程需要等待。 代码示例:
class Counter {
    private int count;

    public synchronized void increment() {
        count++;
    }
}
  1. Lock接口:Java提供了Lock接口及其实现类ReentrantLock来实现更灵活的同步操作。通过调用lock()方法获得锁,调用unlock()方法释放锁。 代码示例:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class Counter {
    private int count;
    private Lock lock;

    public Counter() {
        count = 0;
        lock = new ReentrantLock();
    }

    public void increment() {
        lock.lock();
        try {
            count++;
        } finally {
            lock.unlock();
        }
    }
}

  1. synchronized关键字与wait()、notify()、notifyAll()方法:可以使用synchronized关键字结合wait()、notify()、notifyAll()方法实现线程间的等待和唤醒操作。 代码示例:
class MyThread implements Runnable {
    private Object lock;

    public MyThread(Object lock) {
        this.lock = lock;
    }

    @Override
    public void run() {
        synchronized (lock) {
            try {
                // 线程等待
                lock.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 线程被唤醒后执行的操作
        }
    }
}

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Object lock = new Object();
        Thread thread = new Thread(new MyThread(lock));
        thread.start();
        
        // 唤醒线程
        synchronized (lock) {
            lock.notify();
        }
    }
}

总结

   

多线程的状态可以总结为以下几种:

  1. 新建(New):线程被创建但还没有启动。

  2. 就绪(Runnable):线程被调度,并且准备开始执行,但还没有开始执行。

  3. 运行(Running):线程正在执行中。

  4. 阻塞(Blocked):线程因为某种原因被阻塞,例如等待 IO 操作完成或在等待锁释放。

  5. 等待(Waiting):线程被指定等待某个条件满足,例如调用了对象的 wait() 方法。

  6. 超时等待(Timed Waiting):线程被指定等待一段时间,例如调用了 Thread.sleep() 方法或带有超时参数的 wait() 方法。

  7. 终止(Terminated):线程执行完毕或者异常终止。

    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vulnhub - AI-WEB-1.0靶机教程

目录 站点信息收集 c段扫描 端口扫描 目录扫描 漏洞利用 使用 burp 抓包 查询数据库名 查询数据库下的表 查询表中的字段名 查询字段中的数据 --os-shell 上传一句话木马 下载地址:https://download.vulnhub.com/aiweb/AI-Web-1.0.7z 我们从站点信息收…

【C/C++】观察者模式

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

LAMP网络服务架构

目录 LAMP 网站服务架构 LAMP的组成部分 LAMP的构建顺序 安装论坛 0.电脑已编译安装Apache&#xff0c;MySQL&#xff0c;PHP 1.创建数据库&#xff0c;并进行授权 2.上传论坛压缩包到 /opt ,并解压 3.上传站点更新包 4.更改论坛目录的属主 5.浏览器访问验证 LAMP 网…

授权调用: 介绍 Transformers 智能体 2.0

简要概述 我们推出了 Transformers 智能体 2.0&#xff01; ⇒ &#x1f381; 在现有智能体类型的基础上&#xff0c;我们新增了两种能够 根据历史观察解决复杂任务的智能体。 ⇒ &#x1f4a1; 我们致力于让代码 清晰、模块化&#xff0c;并确保最终提示和工具等通用属性透明化…

PPT大珩助手新功能-生成迷宫

大珩助手是一款功能丰富的办公软件插件&#xff0c;它主要分为两个版本&#xff1a;PPT大珩助手和Word大珩助手。这两个版本都旨在提高用户在处理演示文稿和文档时的效率。 PPT大珩助手 这是一款专门为Microsoft PowerPoint设计的插件。它提供了多种功能&#xff0c;例如素材…

深入理解Kubernetes的调度核心思想

一、引言 Kubernetes&#xff08;简称K8s&#xff09;是一个开源的容器编排系统&#xff0c;用于自动化部署、扩展和管理容器化应用程序。在Kubernetes集群中&#xff0c;调度器是一个核心组件&#xff0c;它负责将Pod&#xff08;Kubernetes中的最小部署单元&#xff09;分配…

windows内存管理

一 windows系统的内存管理涉及哪些 1.1 虚拟内存管理机制 windows操作系统使用虚拟内存技术&#xff0c;将磁盘文件&#xff0c;通过映射对象&#xff08;存储在物理内存&#xff09;关联&#xff0c;映射到虚拟内存作为文件试图。即用户操作"虚拟内存中File View Objec…

【C语言】10.C语言指针(2)

文章目录 1.数组名的理解2.使用指针访问数组3.一维数组传参的本质4.冒泡排序算法步骤 5.二级指针6.指针数组7.指针数组模拟二维数组 1.数组名的理解 int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0];这里我们使用 &arr[0] 的方式拿到了数组第一个元素的地址&am…

Stable Diffusion【写实模型】:逼真,逼真,超级逼真的国产超写实摄影大模型万享XL

今天和大家分享的是一个国产万享系列中使用量最高的大模型:万享XL_超写实摄影&#xff0c;顾名思义&#xff0c;该大模型主要是面向写实摄影&#xff0c;一方面生成的图片人物皮肤纹理细节超级逼真&#xff0c;另一方面对于光影效果的处理也非常到位。对于万享XL超写实摄影大模…

数组单调栈-901. 股票价格跨度、leetcode

单调栈作为一种数据结构在求解类递增、递减方面的题目中有较为广泛的应用&#xff0c;在以往的leetcode中所见到的相关单调栈的题目均为单一元素&#xff0c;今天刷到901题目时&#xff0c;想到了将数组元素作为单调栈中元素的方法进行求解。 题目链接及描述 901. 股票价格跨…

秋招突击——算法打卡——5/27——复习{寻找特定中位数}——新做:{最长回文字串、Z 字形变换}

文章目录 复习——寻找特定中位数新作——最长回文子串个人思路分析实现代码参考学习和上述思路相同&#xff0c;枚举中心点字符串哈希二分 新作——Z 字形变换个人做法思路分析实现代码 参考解法分析总结 复习——寻找特定中位数 第一次的链接&#xff1a;寻找中位数本来以为…

Reactor模式Proactor模式

1.Reactor/Dispatcher模式 1.1 概述 Reactor模式下&#xff0c;服务端的构成为Reactor 处理资源池。其中&#xff0c;Reactor负责监听和分发事件&#xff0c;而处理资源池则负责处理事件。 该模式下的组合方案有下面几种(第三种几乎没有被实际应用)&#xff1a; 1 * Reacto…

CRLF注入漏洞

1.CRLF注入漏洞原理 Nginx会将 $uri进行解码&#xff0c;导致传入%0a%0d即可引入换行符&#xff0c;造成CRLF注入漏洞。 执行xss语句 2.漏洞扩展 CRLF 指的是回车符(CR&#xff0c;ASCII 13&#xff0c;\r&#xff0c;%0d) 和换行符(LF&#xff0c;ASCII 10&#xff0c;\n&am…

栈 队列

目录 1.1栈的基本概念 1.1.1栈的定义 1.1.2栈的基本操作 1.2栈的顺序存储结构 1.2.1构造原理 1.2.2基本算法 1.3栈的链式存储结构 1.3.1构造原理 1.3.2基本算法 2.1队列的基本概念 2.1.1队列的定义 2.1.2队列的基本运算 2.2队列的顺序存储结构 2.2.1构造原理 2.2.1基…

C++ | Leetcode C++题解之第115题不同的子序列

题目&#xff1a; 题解&#xff1a; class Solution { public:int numDistinct(string s, string t) {int m s.length(), n t.length();if (m < n) {return 0;}vector<vector<unsigned long long>> dp(m 1, vector<unsigned long long>(n 1));for (i…

通过Zerossl给IP申请免费SSL证书, 实现https ip访问

参考通过Zerossl给IP申请免费SSL证书 | LogDicthttps://www.logdict.com/archives/tong-guo-zerosslgei-ipshen-qing-mian-fei-sslzheng-shu

软件系统开发标准流程文档(Word原件)

目的&#xff1a;规范系统开发流程&#xff0c;提高系统开发效率。 立项申请需求分析方案设计方案评审开发调整测试阶段系统培训试运行测试验收投入使用 所有文档过去进主页获取。 软件项目相关全套精华资料包获取方式①&#xff1a;点我获取 获取方式②&#xff1a;本文末个人…

【cocos creator 】生成六边形地图

想要生成一个六边形组成的地图 完整代码示例 以下是完整的代码示例&#xff0c;包含了注释来解释每一步&#xff1a; cc.Class({extends: cc.Component,properties: {hexPrefab: {default: null,type: cc.Prefab},mapWidth: 10, // 网格的宽度&#xff08;六边形的数量&am…

(delphi11最新学习资料) Object Pascal 学习笔记---第13章第4节 (内存管理和接口)

13.4 内存管理和接口 ​ 在第11章中&#xff0c;我介绍了接口的内存管理的关键要素。与对象不同&#xff0c;接口是受管理且具有引用计数。如我所提到的&#xff0c;接口引用会增加所引用对象的引用计数&#xff0c;但您可以声明接口引用为弱引用以禁用引用计数&#xff08;但…

Prometheus Operator创建告警规则并接入钉钉报警

prometheus之钉钉报警 前言1. 添加prometheus报警规则1.2 添加自定义报警规则文件 2. 配置钉钉报警2.2 部署dingding插件 3. 编写alertmanager配置文件 前言 在kubenetes上安装了kube-promethues&#xff08;包含Prometheus Operator&#xff09;,程序正常跑起来了&#xff0c…