复习并发编程的基础知识(一)

news2025/2/13 13:06:04

时间长了,并发编程的基础知识总忘,来记录一下:

进程和线程

进程:资源分配的最小单元,什么是资源?CPU,内存,网卡等等

线程:进程中的一个实体,不能单独存在,依赖进程存在。CPU调度的最小单元。

并发和并行

并发:单位时间内,多个任务交替执行。

 并行:同一时刻,每个任务同时执行。多核CPU可以实现并行。

 如何创建一个线程?

1,继承Thread类

package cn.tulingxueyuan.xiaoshanshan.base;

public class UseThread {

    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
    }

}

class MyThread extends Thread{
    @Override
    public void run() {
        //要执行的代码
        System.out.println("hello ,Thread");
    }
}

2,实现Runnable接口

package cn.tulingxueyuan.xiaoshanshan.base;

public class UseRunnable {
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable); // Runnable接口也要借助Thread类才能启动
        thread.start();
    }

}

class MyRunnable implements Runnable{
    @Override
    public void run() {
        // 要执行的代码
        System.out.println("hello ,Runnable");
    }
}

其实Thread类也实现了Runnable接口

我们在启动一个java进程的时候,main()是主线程,在main()方法中又启动了子线程,当主线程运行结束了不意味着进程就结束了,所有线程结束了进程才结束。在main线程中启动一个子线程Thread-0,主线程不会因为有子线程的执行而阻塞,main线程和线程Thread-0会并行执行。

如下图程序中,当运行该程序的时候,控制台(Terminal中)输入jconsole,可以查看线程的情况,当main()方法执行完成之后会退出,Thread-0会继续执行。当Thread-0执行结束以后,会卡死或者断开。

package cn.tulingxueyuan.xiaoshanshan.base;

public class CatThreadDemo {


    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.start();
        for(int  i =0 ;i<60;i++){

            System.out.println(i +", 执行线程名"+Thread.currentThread().getName());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }


}
class Cat extends Thread{

    int times = 0;

    @Override
    public void run() {
        String name = Thread.currentThread().getName();
        while(true){

            System.out.println("喵喵,我是一只小猫猫~" + (++times) + "线程名称:" + name);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if(times == 80){

                break ;
            }
        }
    }
}

 

 线程Thread类的一些重要方法

start()方法:一个线程只有调用这个方法后,才能真正和操作系统的线程挂钩,

底层是调用了start0()方法,这个方法是native方法,即本地方法,底层是C或者C++实现的,是JVM来调用的,真正实现了多线程。

run()方法:这个方法中是要写的代码逻辑

setName()设置线程名称

getName()得到线程名称

sleep()睡眠,不会释放锁 Thread类调用的静态方法

interrupt()中断方法,不是终止方法

yiled()静态方法,礼让方法,不一定礼让成功,在Cpu资源比较紧张的时候,礼让的效果比较明显

join()线程的插队(这里有个面试题:有三个线程:t1,t2,t3,如何保证t3在t2之前完成,t2在t1之前完成)

package cn.tulingxueyuan.xiaoshanshan.base;

public class UseJoin {


    public static void main(String[] args) {
        JoinThread t1 = new JoinThread();
        JoinThread t2 = new JoinThread();
        JoinThread t3 = new JoinThread();
        t1.setName("t1");
        t2.setName("t2");
        t3.setName("t3");
        t1.setT(t2);
        t2.setT(t3);
        t1.start();
        t2.start();
        t3.start();

    }

}

class JoinThread extends Thread{
    Thread t ;

    public void setT(Thread t) {
        this.t = t;
    }

    @Override
    public void run() {

        if(null!=t){
            try {
                t.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println( "线程:" + Thread.currentThread().getName()  +  "执行我的逻辑...");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

执行结果:

 守护线程:

守护线程服务于用户线程,当用户线程结束的时候,守护线程也结束了

package cn.tulingxueyuan.xiaoshanshan.base;

public class DaemonThread {

    public static void main(String[] args) throws InterruptedException {
        MyDaemonThread myDaemonThread = new MyDaemonThread();
        myDaemonThread.setDaemon(true);
        myDaemonThread.start();

        for (int i =0;i<10;i++){
            Thread.sleep(1000);
            System.out.println(Thread.currentThread().getName() + "打印出:" +i);
        }
    }
}

class MyDaemonThread extends Thread{

    @Override
    public void run() {
        while(true){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "打印出:" + Math.random()*100+1);
        }
    }
}

看,main线程结束了,守护线程Thread-0也结束了。

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

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

相关文章

七、DMSP/OLS、NPP/VIIRS等夜间灯光数据能源碳排放空间化——能源碳排放增长类型、增长率、总量增长等级分析

一、前言 前文对能源碳排放空间化后的分析角度做了一些介绍,其实无非就是能源碳排放增长类型、增长率等的计算,那么这里强调一下,这个时候不能用利用统计数据计算出来的能源碳排放数据进行计算,而是必须用反演的能源碳排放数据进行划定计算。 二、具体步骤 增长类型 (…

【Excel超实用快捷键!!!办公效率1000%up!up!up!】

目录索引 ctrle&#xff1a;提取数据&#xff1a;合并数据&#xff1a; 普通快捷键&#xff1a;ctrla&#xff1a;ctrlc&#xff1a;ctrlv&#xff1a;ctrlx&#xff1a;ctrlz&#xff1a;ctrly&#xff1a;ctrls&#xff1a;ctrlf&#xff1a; 文字格式快捷键&#xff1a;ctrl…

IMX6ULL裸机篇之SPI实验-SPI主控寄存器

一. SPI主控寄存器 IMX6ULL 芯片的 SPI接口叫做 ECSPI&#xff0c;支持全双工、主丛可配置。 本文学习 IMX6ULL-阿尔法开发板SPI中控芯片的 SPI寄存器部分。后续代码实现需要配置 SPI相关的寄存器。 二. SPI主控的寄存器配置 1. SPI主控芯片寄存器 (1) RXDATA寄存器&am…

DVWA-Command Injection

大约 命令注入攻击的目的是在易受攻击的应用程序中注入和执行攻击者指定的命令。 在这种情况下&#xff0c;执行不需要的系统命令的应用程序就像一个伪系统外壳&#xff0c;攻击者可能会使用它 作为任何授权的系统用户。但是&#xff0c;命令的执行权限和环境与 Web 服务具有的…

【MySQL】创建和管理表

创建和管理表 标识符命名规则MySQL中的数据类型创建和管理数据库使用数据库修改数据库 创建表语法方式一方式二 修改表向表中追加一个列修改一个列重命名一个列删除一个列 重命名表方式一方式2; 删除表清空表 存储数据是处理数据的第一步 。只有正确地把数据存储起来&#xff0…

基于卫星星历计算卫星在CGCS2000大地坐标系中的坐标

目录 一、北斗系统概述 1.空间星座 2.坐标系统 3.时间系统 二、实验目的 三、实验内容 四、实验过程 五、实验结果 一、北斗系统概述 1.空间星座 北斗卫星导航系统简称北斗系统&#xff0c;英文缩写为 BDS&#xff0c;其空间星座由 5 颗地球静止轨道&#xff08;GEO&…

​“前端已死”甚嚣尘上,全栈工程师卷到起飞

海量应届生入场&#xff0c;坑位却还是那多。具备前后端开发能力的全栈工程师兴起&#xff0c;不仅能够开发前端&#xff0c;还能够处理后端业务逻辑和数据库等技术&#xff0c;还能掌握整个软件开发的细节。企业自然会更愿意招聘全栈工程师&#xff0c;说白了&#xff0c;卷啊…

springboot整合quartz实现定时任务动态增删改查

springboot整合quartz quartz介绍Quartz 核心概念 使用依赖配置文件启动类quartz工具类job业务用到的对象类接口service实现类测试 quartz介绍 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目&#xff0c;它可以与J2EE与J2SE应用程序相结合也可以单独使用。…

【CMake 入门与进阶(6)】 CMakeLists.txt 部分常用变量(附使用代码)

变量也是 cmake 中的一个重头戏&#xff0c;cmake 提供了很多内置变量&#xff0c;每一个变量都有它自己的含义&#xff0c;通过这个链接地址cmake-variables(7) — CMake 3.5.2 Documentation可以查询到所有的内置变量及其相应的介绍&#xff0c;如下所示&#xff1a; 在这一份…

App移动端测试 —— Monkey的日志

Monkey的日志对于分析脚本的执行情况十分必要。 Monkey 日志由以下几部分组成&#xff1a; 测试命令信息&#xff1a;随机种子 seed、运行次数、可运行应用列表、各事件百分比。” 正文内容从这里开始&#xff08;可直接省略&#xff0c;亦可配图说明&#xff09;。 01—Mon…

使用python批量处理工作簿和工作表

案例01 批量新建并保存工作簿 将for语句与xlwings模块相结合&#xff0c;就可以轻松实现批量创建工作簿 import xlwings as xw # 导入xlwings模块 app xw.App(visibleTrue,add_bookFalse) # 启动Excel程序&#xff0c;但不新建工作簿 for i in range(6):workbook app.books…

Pyinstaller 快速找出所需库的方法

目录 【auto-py-to-exe】第三方库 使用【auto-py-to-exe】逐步尝试 1.什么文件都不添加&#xff0c;选择项目与单目录后直接打包 2.直接运行生成的exe文件 3.定位所需的包 4.--add-data 和 --hidden-import 打包为一个exe文件 【auto-py-to-exe】第三方库 其是pyinstaller操…

【头歌-Python】9.1 X射线衍射曲线绘制(project)第3~4关

第3关&#xff1a;X 射线衍射曲线峰值 任务描述 本关任务&#xff1a;读文件中的数据绘制线图形并加绘制峰值。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; python 读取文件中的数据使用 matplotlib 绘制图形 python 读取文件 python读取文件可以用以…

6.volatile与JMM

volatile与JMM 6.1 被volatile修饰的变量有两大特点 特点&#xff1a; 可见性 有序性&#xff1a;有排序要求&#xff0c;有时需要禁重排 内存语义&#xff1a; 当写一个volatile变量时&#xff0c;JMM会把该线程对应的本地内存中的共享变量值立即刷新回主内存中 当读一个vol…

Linux:ftp服务 (vsftpd)

我的ftp服务器为centos7 使用yum安装的vsftpd软件 &#xff08;如果你需要离线yum库&#xff0c;而不会搭建可以查看&#xff09; Linux&#xff1a;rpm查询安装 && yum安装_鲍海超-GNUBHCkalitarro的博客-CSDN博客 安装软件 配置环境 其次是Linux的防火墙和selinu…

写一个Orillusion编辑器(伪)

界面效果 思路 bootstrap控制界面效果jquery动态修改界面内容[Add]增加一个box[Play]导出play.html,打开play.html就可以看到程序运行效果 编辑器代码 <!DOCTYPE html> <html> <!-- TODO 1. 序列化数据,保存工程 2. 反序列化数据,打开工程 --><head>…

Python实现ACO蚁群优化算法优化随机森林回归模型(RandomForestRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法&#xff0c…

腾讯安全SOC+荣获“鑫智奖”,助力金融业数智化转型

近日&#xff0c;由金科创新社主办&#xff0c;全球金融专业人士协会支持的“2023鑫智奖第五届金融数据智能优秀解决方案评选”榜单正式发布。腾讯安全申报的“SOC基于新一代安全日志大数据平台架构的高级威胁安全治理解决方案”获评“鑫智奖网络信息安全创新优秀解决方案”。 …

大数据分析平台释疑专用帖

大数据分析平台是大数据时代&#xff0c;企业数字化运营决策的一大关键平台&#xff0c;但初次接触大数据分析平台时&#xff0c;大家必然是问题多多的&#xff0c;本文将就几个比较常见的问题进行总结回答&#xff0c;希望对正在了解、选型大数据分析平台的大家有所帮助。 首…

Qt学习08:文本输入类与快捷键

文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 文章目录 QLineEditQTextEditQTextCursor QPlainTextQKeySequenceEdit QLineEdit QLineEdit是最基本的输入控件&#xff0c;常用于短行的文本输入。 构造函数 QLineEdit(const QString &contents, QWidget *parent …