黑马程序员_多线程

基础知识

  • 什么是线程
    • 被包含在进程之中, 可以调度的最小单位
    • 应用软件中互相独立,可以同时运行的功能
  • 什么是进程
    • 程序的基本执行实体

总结:

  • 什么是多线程?
    • 有了多线程,可以让程序同时做多件事情
  • 多线程有什么作用?
    • 提供程序的运行效率

  • 并发是什么?
    • 在同一时刻,有多个指令在单个 CPU 上交替执行
  • 并行是什么
    • 在同一时刻,有多个指令在单个 CPU 上同时执行

image.png

在线程中进行并发和并行

多线程的实现方式

第一种继承 Thread 类方式实现:

  1. 定义一个类继承 Thread
  2. 重写 run 方法
  3. 创建对象实例

image.png

image.png

以 Runnable 接口的方式实现

  1. 实现Runnable 接口
  2. 重写方法
  3. 创建实例
  4. 将实例放入 Thread 类对象中

image.png

image.png

Callable接口

有返回值,可以获得多线程的结果

特点:

  1. 创建一个类实现Callable接口
  2. 重写call方法
  3. 创建实例对象
  4. 创建FutureTask对象管理线程结果
  5. 创建Thread类对象 获取结果

image.png

image.png

常见的成员方法

image.png

演示方法:

getName()和setName()

返回线程的名字:
image.png

public class Mythread_01 extends Thread{  
    @Override  
    public void run() {  
        for (int i = 0; i < 100; i++) {  
            System.out.println(getName() + "@" + i);  
        }  
    }  
}

返回的默认名字格式为Thread-序号

  1. 使用setname
  2. 使用Thread(String name)
    1. 但是需要在继承类中使用super方法把带有String的构造方法写出来

线程的优先级

抢占式调度特点:随机

//使用setPriority来设置优先级
t1.setPriority(1);  
t2.setPriority(10);  
t2.start();  
t1.start();

守护线程

当其他非守护线程执行完毕,守护线程会陆续结束

当主线程结束,守护线程是跟着结束

插入线程

image.png

线程.join()

可以讲线程提前用完

线程的生命周期

image.png

线程安全问题

  • 当线程被共享后,其中的数据也会被其他线程修改导致不安全
    • 解决方式:把共享的数据锁起来
      synchronized 锁的特点:
  1. 锁默认打开,有线程进去自动关闭
  2. 代码全部执行完毕,锁自动打开
    image.png
    锁(类的字节码->唯一对象)

同步方法

image.png

image.png

lock锁

image.png
标准写法:

Lock lock = new ReentrantLock();

while(true){  
  //  synchronized (Myrunnable.class){  
    lock.lock();  
    try {  
        if(ticket == 100){  
            break;  
        }else{  
            Thread.sleep(10);  
            ticket++;  
            System.out.println(Thread.currentThread().getName() + " sell " + ticket + " tickets");  
        }  
    } catch (Exception e) {  
        throw new RuntimeException(e);  
    } finally {  
        lock.unlock();  
    }

死锁

死锁是一种错误,需要我们去避免的
特点:

  • A锁等着拿B锁
  • B锁等着拿A锁
  • 互相卡死
    image.png

生产者和消费者

完整过程:
image.png

常见方法

image.png
代码执行的流程:

  1. 循环
  2. 同步代码块
  3. 判断共享数据是否到了末尾(到了末尾)
  4. 判断共享数据是否到了末尾(未到末尾)

分为三块代码:
Desk:控制消费者和生产者的行为

package 生产者消费者;  
  
public class Desk {  
  
  
    //Desk:控制生产者和消费者的行为  
  
    // 是否有面条  
    public static int foodFlag = 0;  
  
    //制造的个数  
    public static int count = 10;  
  
    //锁对象  
    public static Object lock = new Object();  
}

Cook:生产者

package 生产者消费者;  
  
public class Cook extends Thread {  
    @Override  
    public void run() {  
        while (true) {  
            synchronized (Desk.lock) {  
                if (Desk.count == 0) { //桌子上的食物做够了  
                    break;  
                }else{  
                    //判断是否有食物  
                    if(Desk.foodFlag == 1){ //如果有食物 等待消费者来吃  
                        try {  
                            Desk.lock.wait();  
                        } catch (InterruptedException e) {  
                            throw new RuntimeException(e);  
                        }  
                    }else{  
                        //如果没有食物 做  
                        //修改食物状态  
                        System.out.println("厨师做了一碗面条");  
                        Desk.foodFlag = 1;  
                        //叫醒消费者吃  
                        Desk.lock.notifyAll();  
                    }  
                }  
            }  
        }  
    }  
}

Foodie:消费者

package 生产者消费者;  
public class Foodie extends Thread{  
    @Override  
    public void run() {  
        while(true){  
            synchronized (Desk.lock){  
                if(Desk.count == 0){ //桌子上的食物做够了  
                    break;  
                }else {  
                    //判断桌子上有没有面条  
                    if(Desk.foodFlag ==  0){  
                        //如果没有 就等待  
                        try {  
                            Desk.lock.wait(); //让线程等待  
                        } catch (InterruptedException e) {  
                            throw new RuntimeException(e);  
                        }  
                    }else{ //如果有 直接开吃  
                        Desk.count--;  
                        System.out.println("吃货吃了一碗,还剩" + Desk.count + "碗!");  
                        //唤醒厨师! 份数-1  
                        Desk.lock.notifyAll();  
                        //修改桌子的状态  
                        Desk.foodFlag = 0;  
                    }  
                }  
            }  
        }  
    }  
}

阻塞队列方式

image.png
实现类:
ArrayBlockingQueue
LinkedBlockingQueue

队列和链表自带锁

线程的状态

七大状态:
image.png

线程中的栈

image.png

当在run方法中创建了一个集合,那么每一个线程都会维持一个创建的集合(类似于static)

线程池

image.png

image.png

image.png

代码:
image.png

自定义线程池

image.png
image.png

最大并行数

  • 什么是最大并行数?
    就是电脑的核心处理单元和线程,这里是八核十六线程
    image.png

image.png

计算类型多:

image.png
读取文件或者数据库比较多:
image.png

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

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

相关文章

DC电源模块在新能源领域的应用前景

BOSHIDA DC电源模块在新能源领域的应用前景 DC电源模块在新能源领域有着广阔的应用前景。随着可再生能源技术的发展和普及&#xff0c;如太阳能和风能等的应用逐渐增多&#xff0c;DC电源模块在这些领域的应用越来越重要。 首先&#xff0c;DC电源模块可以用于太阳能发电系统…

车载音频EMI的产生及典型音频功放AW836XX的解决方案

之前针对 eCall的文章中有提到D类音频功放需要关注EMI问题&#xff08;点击文章回看《车载eCall系统音频应用解决方案》&#xff09;&#xff0c;在此展开此问题并寻求解决方案。 1. EMI定义与分类 电磁干扰&#xff08;Electromagnetic Interference&#xff0c;EMI&#xff…

geemap学习笔记049:下载Landsat数据时遇到的一个问题

前言 最近在下载Landsat 8 地面反射率数据&#xff08;Surface Reflectance&#xff09;时&#xff0c;遇到了一个问题&#xff0c;无论是使用geemap.ee_export_image_to_drive() 函数还是geemap.download_ee_image() 函数下载的数据&#xff0c;易康都打不开&#xff0c;显示…

【CSDN博客系列】自定义模块

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

还在为crontab表达式发愁吗,快使用这个工具

是不是每次要定义cron表达式的时候&#xff0c;都去百度翻找资料&#xff0c;cron表达式难写难记真是苦天下程序员久已。有没有什么不拥记的办法就轻松掌握呢&#xff1f;最近发现这个CrontabGuru神器&#xff0c;强烈推荐&#xff0c;真是广大程序员的福音了。 简介 Crontab…

电脑技巧:安装手机与Win10电脑怎样互传文件,看完你就会了

目录 一、Windows网络邻居功能 二、数据线传输 三、蓝牙连接 大家在日常工作当中&#xff0c;会遇到需要实现手机和Win10电脑之间的文件传输&#xff0c;今天小编给大家推荐使用Win10系统自带的网络邻居功能来实现手机与电脑之间数据的传输&#xff0c;希望对大家日常办公提…

喜讯!无垠智能模糊测试系统入选“2023软件供应链优秀成果”

近日&#xff0c;中国信通院信息通信软件供应链安全社区正式公布了“2023软件供应链优秀成果”&#xff0c;其中&#xff0c;云起无垠的无垠智能模糊测试系统凭借其自主研发的创新成果&#xff0c;成功入选该名单。 图 获奖成果 自发起以来&#xff0c;软件供应链优秀成果案例…

html画动态桃心

html画动态桃心 效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetwindows-1252"><title></title><style>* {padding: 0;margin…

从uptime看linux平均负载

从前遇到系统卡顿只会top。。top看不出来怎么搞呢&#xff1f; Linux系统提供了丰富的命令行工具&#xff0c;以帮助用户和系统管理员监控和分析系统性能。在这些工具中&#xff0c;uptime、mpstat和pidstat是非常有用的命令&#xff0c;它们可以帮助你理解系统的平均负载以及资…

电子行业除镍树脂深度出水0.02ppm

项目名称 电子行业贴片电容废水除镍项目 工艺选择 两级串联运行 工艺原理 亚氨基二乙酸和重金属离子通过螯合作用形成稳定的配位键&#xff0c;实现选择性吸附重金属 项目背景 贴片电容&#xff0c;也被称为多层片式陶瓷电容器&#xff08;MLCC&#xff09;&#xff0c;…

SQL Server Management Studio创建数据表

文章目录 一、建表注意事项1.1 数据类型1.2 建立数据表的基本SQL语法 二、实例说明2.1 创建数据表2.2 实例2 三、标识列和主键示例&#xff1a; 一、建表注意事项 1.1 数据类型 可以看这个去了解数据类型&#xff1a; 1.2 建立数据表的基本SQL语法 建立数据表的基本 SQL 语…

UDS诊断(ISO14229-1) 36服务

文章目录 功能简介应用场景请求和响应1、请求2、子功能3、肯定响应4、否定响应 NRC 判断优先级顺序报文示例1、下载数据到服务器 UDS中常用 NRC 功能简介 36服务&#xff0c;即 TransferData&#xff08;传输数据&#xff09;服务&#xff0c;客户端利用 TransferData&#xf…

十、Qt 操作PDF文件

《一、QT的前世今生》 《二、QT下载、安装及问题解决(windows系统)》《三、Qt Creator使用》 ​​​ 《四、Qt 的第一个demo-CSDN博客》 《五、带登录窗体的demo》 《六、新建窗体时&#xff0c;几种窗体的区别》 《七、Qt 信号和槽》 《八、Qt C 毕业设计》 《九、Qt …

数学建模.皮尔逊相关系数

一.前言 皮尔逊相关系数说白了就是一次函数中的斜率k&#xff0c;反应两个变量之间的关系&#xff0c;与斜率不同的地方在于其数值在1和-1之间&#xff0c;越接近于1&#xff0c;则说明两个变量之间是完全正向的线性关系&#xff1b;越接近于-1&#xff0c;说明两个变量之间是完…

RTMP对接腾讯云问题记录

RTMP对接腾讯云问题分析报告 问题现象及原因分析 1. 连不上腾讯云RTMP服务器 连不上腾讯云RTMP服务器&#xff0c;抓包显示服务器在握手完成后&#xff0c;主动断开了当前TCP链接。问题原因可能是connect中的tcUrl不能把域名转为IP&#xff0c;导致在握手不久服务器主动断开…

yum仓库详解(命令+搭建)

目录 一、初步了解yum 1、yum简介 2、yum实现过程 二、yum配置文件及命令 1、 yum配置文件 1.1 主配置文件 1.2 仓库设置文件 1.3 日志文件 2、yum命令详解 三、搭建仓库的方法 1、搭建本地yum仓库 2、搭建阿里云仓库&#xff08;http方式外网环境&#xff09; 3、f…

CSDN 年度总结|知识改变命运,学习成就未来

欢迎来到英杰社区&#xff1a; https://bbs.csdn.net/topics/617804998 欢迎来到阿Q社区&#xff1a; https://bbs.csdn.net/topics/617897397 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff…

目标检测开源数据集——道路坑洼

一、危害 对车辆的影响&#xff1a;道路坑洼会导致车辆行驶不稳&#xff0c;增加车辆的颠簸&#xff0c;不仅影响乘坐舒适度&#xff0c;还可能对车辆的悬挂系统、轮胎等造成损害。长期在坑洼路面上行驶&#xff0c;车辆的减震系统、悬挂系统等关键部件容易受损&#xff0c;进…

C语言第一弹---C语言基本概念(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 C语言基本概念 1、C语言是什么&#xff1f;2、C语言的历史和辉煌3、编译器的选择VS20223.1、编译和链接3.2、编译器对比3.3、VS2022优缺点 4、VS项目和源文件、头…

IDEA 在本地启动多个 SpringBoot 后端服务模拟集群

目录 方式一&#xff1a;使用 IDEA 界面在多个后端端口运行同一个项目 方式二&#xff1a;通过控制台在运行项目 jar 包时传入端口配置 方式一&#xff1a;使用 IDEA 界面在多个后端端口运行同一个项目 1. 点击 Run / Debug 在默认端口启动项目 2. 点击 Services&#xff0…