并发编程之线程

news2024/11/15 12:29:57

一、并发、并行、串行

并发: 多个任务在同一时间段内同时执行,如果是单核计算机,CPU会不断地切换任务来完成并发操作

并行:多任务在同一时刻同时执行,计算机需要有多核心,每个核心独立执行一个任务,多个任务同时执行,不需要切换

串行:多任务开始执行,任务A、B、C全部执行完成后才算是结束

二、线程的定义

线程是一个轻量级的进程,是进程中的一个执行单元,是CPU的最小调度单元,一个进程中可以有N个线程

三、线程的创建(Java中是如何使用线程的)

3.1 实现Runable接口

public class Thread01 implements Runnable{

    @Override
    public void run() {
        System.out.println("当前线程为:" + Thread.currentThread().getName());
    }
}

3.2 匿名内部类实现Runable接口

public class Thread02 {

    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("使用匿名内部类,实现Runnable接口的当前线程" + Thread.currentThread().getName());
            }
        });
        thread.start();
    }
}

3.3 继承Thread对象

public class Thread03 extends Thread {


    @Override
    public void run() {
        System.out.println("继承Thread类的当前线程" + Thread.currentThread().getName());
    }
}

3.4 匿名内部类继承Thread对象

public class Thread04 {

    public static void main(String[] args) {
        Thread thread = new Thread() {
            @Override
            public void run() {
                System.out.println("匿名内部类继承Thread的当前线程" + Thread.currentThread().getName());
            }
        };
        thread.start();
    }
}

3.5 Lambda表达式

public class Thread05 {

    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            System.out.println("使用lambda表达式创建当前线程:" + Thread.currentThread().getName());
        });
        thread.start();
    }
}

实现Callable接口   线程池创建(后续补充)

四、线程的启动和停止方式

线程的启动就是执行start方法,然后启动该线程。

线程停止:正常的情况下应该满足 1.停止接收新的请求 2.然后把已经接收到的请求处理完 3.停止线程

interrupt()友好的停止线程

主动停止的方式->run方法执行结束

被动停止的方式

public class Thread01 implements Runnable{

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new Thread01());
        thread.start();
        Thread.sleep(2000);
        thread.interrupt();   //发送一个中断信号 中断标记变为true
    }
    @Override
    public void run() {
        // Thread.currentThread().isInterrupted() 获取中断状态
        while (!Thread.currentThread().isInterrupted()) {  
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {   // 中断标记变为false
                e.printStackTrace();  // 这里会复位
                //todo  这里的选择在于开发者  决定是否要真的中断
                Thread.currentThread().interrupt(); // 真正的中断  中断标记变为true
            }
            System.out.println("当前线程为:" + Thread.currentThread().getName());
        }
    }
}

分析:线程的中断在底层会有一个中断标记,当主线程执行interrupt(),就会向该线程发出一个中断标记,表示我要你当前线程中断了,但是真正的中断与否取决于当前线程,Thread.currentThread().isInterrupted()该方法会获取主线程发过来的中断状态并且复位,然后真正的中断操作由开发者在当前线程决定,这就是友好的线程中断方式

:TInterruptedExceptio该异常有两个功能  1. 唤醒处于阻塞状态下的线程, 2.修改中断的状态由true变为false

五、线程的生命周期

线程从start启动一个线程   到线程中的指令执行完毕后结束,即run方法结束

六、线程的状态流转

分析: 线程在java中分为6个状态  NEW 、RUNNABLE、WAITING、TIMED_WAITING、 BLOCKED、TERMINATED

在源码的Thread类中有这么一个状态枚举

    public enum State {
        /**
         * Thread state for a thread which has not yet started.
         */
        NEW,

        /**
         * Thread state for a runnable thread.  A thread in the runnable
         * state is executing in the Java virtual machine but it may
         * be waiting for other resources from the operating system
         * such as processor.
         */
        RUNNABLE,

        /**
         * Thread state for a thread blocked waiting for a monitor lock.
         * A thread in the blocked state is waiting for a monitor lock
         * to enter a synchronized block/method or
         * reenter a synchronized block/method after calling
         * {@link Object#wait() Object.wait}.
         */
        BLOCKED,

        /**
         * Thread state for a waiting thread.
         * A thread is in the waiting state due to calling one of the
         * following methods:
         * <ul>
         *   <li>{@link Object#wait() Object.wait} with no timeout</li>
         *   <li>{@link #join() Thread.join} with no timeout</li>
         *   <li>{@link LockSupport#park() LockSupport.park}</li>
         * </ul>
         *
         * <p>A thread in the waiting state is waiting for another thread to
         * perform a particular action.
         *
         * For example, a thread that has called <tt>Object.wait()</tt>
         * on an object is waiting for another thread to call
         * <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on
         * that object. A thread that has called <tt>Thread.join()</tt>
         * is waiting for a specified thread to terminate.
         */
        WAITING,

        /**
         * Thread state for a waiting thread with a specified waiting time.
         * A thread is in the timed waiting state due to calling one of
         * the following methods with a specified positive waiting time:
         * <ul>
         *   <li>{@link #sleep Thread.sleep}</li>
         *   <li>{@link Object#wait(long) Object.wait} with timeout</li>
         *   <li>{@link #join(long) Thread.join} with timeout</li>
         *   <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
         *   <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
         * </ul>
         */
        TIMED_WAITING,

        /**
         * Thread state for a terminated thread.
         * The thread has completed execution.
         */
        TERMINATED;
    }

6.1 新建状态(NEW)

创建一个线程,但还未启动,为初始NEW状态

6.2 运行中(RUNNABLE)

增加了一个start方法 启动该线程,则该线程进入RUNNABLE状态

6.3 等待(WAITING)

调用wait方法让线程处于等待状态

6.4 阻塞(BLOCKED)

public class ThreadBlocked {
    synchronized public static void blocked() {
        try {
            Thread.sleep(1000000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
    public static void main(String[] args) throws InterruptedException{
        Thread thread1 = new Thread(ThreadBlocked::blocked);
        Thread thread2 = new Thread(ThreadBlocked::blocked);
        thread2.start();
        thread1.start();
        System.out.println("线程状态:" + thread2.getState());
        System.out.println("线程状态:" + thread1.getState());
    }
}

线程2先获取到锁,线程1就处于阻塞状态

6.5 超时等待(TIMED_WAITING)

与等待类似,只不过限定了一个时间,超过时间就取消等待

6.6 终止状态(TERMINATED)

线程运行结束

七、线程的通信方式

1.共享内存。如volatile共享内存

2.消息传递。如wait/notify等待通知方式

3.管道输入/输出流。 如PipedOutputStrean、PipedInputStrean、PipedReader和PipedWriter

八、线程的安全性问题

如果多个线程在做同一件事情的时候,会造成以下的安全性问题:

1.原子性  Synchronized、AtomicXXX、Lock

2.可见性 Synchronized、volatile

3.有序性 Synchronized、volatile

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++文件操作(1)

C文件操作 1.文本的写入及读取文本文件写入文本文件读取 2.二进制文件的写入及读取二进制文件写入二进制文件读取 3.小结 C也有处理文件的能力&#xff0c;其功能实现依赖文件流。文件流是C中用来处理文件输入输出的一种流类。文件流可以用于从文件中读取数据或将数据写入到文件…

洛谷P8599 [蓝桥杯 2013 省 B] 带分数

[蓝桥杯 2013 省 B] 带分数 题目描述 100 100 100 可以表示为带分数的形式&#xff1a; 100 3 69258 714 100 3 \frac{69258}{714} 100371469258​。 还可以表示为&#xff1a; 100 82 3546 197 100 82 \frac{3546}{197} 100821973546​。 注意特征&#xff1a;带分…

ASTORS国土安全奖:ManageEngine AD360荣获银奖

美国安全今日&#xff08;AST&#xff09;的年度“ASTORS”国土安全奖计划是一个备受瞩目的活动&#xff0c;致力于突显国土安全领域的创新与进步。这一奖项旨在表彰在保护国家免受安全威胁方面做出卓越贡献的个人和组织。该计划汇聚了执法、公共安全和行业领袖&#xff0c;不仅…

【Web前端实操20】商城官网_黑色导航

今天继续着上一篇博客的内容进行编写,本次主要实现的是商场官网实战里面的黑色导航栏部分,也就是广告图片下面的部分。 本次除了每篇都要通用的样式CSS代码之外,还增添了一个引用矢量图标的样式,如果有兴趣的友友们,可以看看我的这篇博客,上面详细介绍了如何下载矢量图标…

live2D学习:做好让图片动起来的准备

做好让图片动起来的准备https://www.bilibili.com/video/BV1JE411Y7Te?p2&vd_source124076d7d88eee393a1d8bf6fc787efa 把psd文件通过菜单栏的“打开文件”进行导入或直接把psd文件拖到Live2D Cubism Editor 4.0的面板中 网格 我们在点击图像的一部分时&#xff0c;会出现…

Boosting semantic human matting with coarse annotations

前向推理在modelscope中开源了&#xff0c;但是训练没开源&#xff0c;且是基于TensorFlow的&#xff0c;复现起来是比较麻烦的。 1.Introduction 分割技术主要集中在像素级二元分类&#xff0c;抠图被建模为前景图像F和背景图像B的加权融合&#xff0c;大多数matte方法采用指…

RK3568平台 热插拔机制

一.热插拔的基本概念 热插拔是指在设备运行的情况下&#xff0c;能够安全地插入或拔出硬件设备&#xff0c;而无需关闭或重启系统。这意味着你可以在计算机或其他电子设备上插入或拔出硬件组件&#xff08;比如USB设备&#xff0c;扩展卡&#xff0c;硬件驱动器等&#xff09;…

001集—shapefile(.shp)格式详解——arcgis

一、什么是shapefile Shapefile 是一种用于存储地理要素的几何位置和属性信息的非拓扑简单格式。shapefile 中的地理要素可通过点、线或面&#xff08;区域&#xff09;来表示。包含 shapefile 的工作空间还可以包含 dBASE 表&#xff0c;它们用于存储可连接到 shapefile 的要…

mysql入门到精通003-基础篇-SQL

1、目录 2、SQL通用语法及分类 2.1 SQL通用语法 2.2 SQL分类 3、SQL DDL数据库操作 3.1 SQL DDL表操作-创建&查询 3.1.1 表操作-查询 3.1.2 表操作-创建 create table tb_user(id int comment 编号,name varchar(50) comment 用户名,age int comment 用户名,gender varch…

MySQL库表操作 作业

题目&#xff1a; 1. sql语句分为几类?2. 表的约束有哪些,分别是什么,设置的语法分别是什么?3. 做出班级表,学生表的E-R图,数据库模型图,以及核心的sql语句. 1. MySQL致力于支持全套ANSI/ISO SQL标准。在MySQL数据库中&#xff0c;SQL语句主要可以划分为以下几类: > DD…

搜索引擎评价指标及指标间的关系

目录 二分类模型的评价指标准确率(Accuracy,ACC)精确率(Precision,P)——预测为正的样本召回率(Recall,R)——正样本注意事项 P和R的关系——成反比F值F1值F值和F1值的关系 ROC&#xff08;Receiver Operating Characteristic&#xff09;——衡量分类器性能的工具AUC&#xff…

OpenCV 2 - 矩阵的掩膜操作

1知识点 1-1 CV_Assert(myImage.depth() == CV_8U); 确保输入图像是无符号字符类型,若该函数括号内的表达式为false,则会抛出一个错误。 1-2 Mat.ptr(int i = 0); 获取像素矩阵的指针,索引 i 表示第几行,从0开始计行数。 1-3 const uchar* current = mylmage.ptr(row); 获得…

Physically Based Area Lights

11.1 概括 本章介绍了由 Guerrilla Games 公司在 PS4 开发的基于物理的区域照明系统&#xff08;见图11.1&#xff09;。 我们提出了一种新颖、实时的区域照明分析模型&#xff0c;能够支持多种照明形状。每种形状都可以用平面上简单的三维或二维函数来表示。讨论的应用包括以下…

Apache Flink文件上传漏洞(CVE-2020-17518)漏洞代码分析

漏洞复现参考如下文章 Apache Flink文件上传漏洞&#xff08;CVE-2020-17518&#xff09;漏洞复现分析_文件上传漏洞复现cve-CSDN博客 分析代码的话&#xff0c;首先找到漏洞修复的邮件 漏洞详情&#xff0c;可以看到漏洞概要&#xff0c;影响的版本&#xff0c;漏洞描述以及…

Docker核心教程

1. 概述 官网&#xff1a;https://docs.docker.com/ Docker Hub 网站&#xff1a;https://hub.docker.com/ 容器较为官方的解释&#xff1a; 一句话概括容器&#xff1a;容器就是将软件打包成标准化单元&#xff0c;以用于开发、交付和部署。 容器镜像是轻量的、可执行的独立…

嵌入式学习第十四天!(结构体、共用体、枚举、位运算)

1. 结构体&#xff1a; 1. 结构体类型定义&#xff1a; 嵌入式学习第十三天&#xff01;&#xff08;const指针、函数指针和指针函数、构造数据类型&#xff09;-CSDN博客 2. 结构体变量的定义&#xff1a; 嵌入式学习第十三天&#xff01;&#xff08;const指针、函数指针和…

Meta开源Code Llama 70B,缩小与GPT-4之间的技术鸿沟

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【C++基础入门】一、C++初识

一、C初识 1.1 第一个C程序 编写一个C程序总共分为4个步骤 创建项目创建文件编写代码运行程序 1.1.1 创建项目 ​ Visual Studio是我们用来编写C程序的主要工具&#xff0c;我们先将它打开 1.1.2 创建文件 右键源文件&#xff0c;选择添加->新建项 给C文件起个名称&am…

vue3-hand-mobile

当我写完手势移动事件后&#xff0c;我又通过svg的方法添加了一段文字和polygon。当我在这个蓝色的polygon上滑动手势的时候&#xff0c;会报错。 可能这个bug只是我个人的代码导致的。但是我觉得vue3-hand-mobile插件的这一段代码写的有问题。 我通过circular-json库修复了这…

petalinux2022.2启动文件编译配置

安装必要运行库: sudo apt-get install iproute2 gawk python3 python sudo apt-get install build-essential gcc git make net-tools libncurses5-dev tftpd sudo apt-get install zlib1g-dev libssl-dev flex bison libselinux1 gnupg wget git-core diffstat sudo apt-ge…