多线程基本知识

news2024/10/22 16:12:59

目录

程序,进程,线程

程序

含义

我的理解:

举例

进程

含义

我的理解:

举例

线程

含义

我的理解:

举例

多线程的并发

并发的含义

并发和并行的区别

并发含义

区别

线程的创建

继承 Thread 类创建多线程

案例

代码如下

结果展示

实现Runnable 接口创建多线程

案例

代码如下

结果展示

使用 Lambda 表达式 创建多线程

格式

使用原因(如上图所示)

使用Lambda表达式 重写 龟兔赛跑

代码如下

实现Callable 接口创建多线程

案例

代码展示

结果展示


程序,进程,线程

程序

含义

程序是为了实现特定目标或解决特定问题,用某种计算机语言(如C、C++、Java、Python等)编写的一组指令或语句的集合。这些指令被计算机硬件或软件解释和执行,以完成特定的计算或控制任务。

我的理解:

程序是程序员使用编程语言编写的代码集合,其中包含算法、逻辑指令和数据处理规则,这些代码通过计算机执行,将抽象的算法和逻辑映射到现实生活中,以实现特定的功能或解决特定的问题,从而满足人们的需要。”

举例

1 我们常常把我们在电脑桌面上的图标称为程序的可视化表示,当我们点击图标时,打开对应的程序

2 在电脑中我们常常把.exe可执行文件作为程序存入硬盘

进程

含义

进程是计算机中程序的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础

我的理解:

进程是 程序开始 到结束这个过程

举例

我们点击电脑桌面上 qq图标,打开qq 和其他人聊天,到我们结束聊天,把qq关了/电脑关机。这一过程 就是进程的体现

线程

含义

线程是“进程”中某个单一顺序的控制流,也被称为轻量进程(lightweight processes)。它是运行中的程序的调度单位,是进程中的一个实体,一个进程可以拥有多个线程,这些线程共享进程的资源。

我的理解:

线程是进程的执行单元,执行着 进程整个过程中线程需要完成的任务

举例

假如有个场景: 你打开qq 和朋友聊天,这时候你想和朋友分享你这边美丽的风景,但你因某些原因,照片迟迟没有发送上去,于是你就跟朋友解释 。

这个过程中  两个线程执行任务有:

线程1 : 聊天 ; 线程2 :发送照片 。通过这副场景,我们知道线程1 和线程2 两者互不制约:并不会因为线程2 (发送照片)暂时无法执行,而不能执行线程1 (聊天)。

从这我们就清楚了,线程和线程之间的关系:并发

多线程的并发

并发的含义

从宏观上理解就是,同时进行着多项任务,但从微观角度上来说:并不是同时的。而是cpu 划分时间区间(时间片)哪个线程先抢到时间片,谁就先执行 ,因此从微观上来说,每过线程都是串行的(排成一条长队,必须先前面的人完成后,下一个才继续。) 。但因为时间片 ,分配时间很短,可以看作同时执行多选任务

下图 就是模拟多线程抢占时间片的场景图

并发和并行的区别
并行含义

并行是一种物理上的概念,它要求程序中的多个任务在真正的同时执行。这通常需要多个处理器或处理器核心的支持。

区别

1 并行更多是依赖机器的配置 ,实现同时执行; 并行更多是依赖时间片轮转调度,从宏观上达到同时执行

线程的创建

继承 Thread 类创建多线程

案例

使用 继承 Thread 类创建多线程 来模拟 龟兔赛跑

兔子速度 8 m/ms; 乌龟 速度 2 m/ms;总长度为100米 ,当兔子跑到80米时休息了4s

代码如下

package itheima.workspace;

public class Demo1 {
    public static void main(String[] args) throws InterruptedException {
        RunTask rabbit = new RunTask(8,true);
        RunTask turtle = new RunTask(2,false);
        //启动线程
        rabbit.start();
        turtle .start();
        // 设置线程名称
        rabbit.setName("兔子");
        turtle.setName("乌龟");
        //等待线程结束
        rabbit.join();
        turtle.join();
        long time= rabbit.getSumTime();
        long time2= turtle.getSumTime();
        if (time>time2) {
            System.out.println("乌龟赢得第一名");
        }
        else {
            System.out.println("兔子赢得第一名");
        }
        }


    }
class RunTask extends Thread {
    private  int speed;
    private boolean isSleep;
    private long sumTime;

    /**
     *
     * @param speed
     * @param isSleep
     */
    public RunTask(int speed, boolean isSleep) {
        this.speed = speed;
        this.isSleep = isSleep;
    }


    public long getSumTime() {
        return sumTime;
    }


    public void run() {
        System.out.println(Thread.currentThread().getName()+"以"+speed+"m/ms速度奔跑");
        long startTime = System.currentTimeMillis();
        int m=0;
            while (true) {
                if (isSleep){
                    if(m==80){
                        try {
                            Thread.sleep(4000);
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }

                }
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                m=m+speed;
                if(m>=100){
                    System.out.println(Thread.currentThread().getName()+"走完100米");
                    break;
                }
                else {
                    System.out.println(Thread.currentThread().getName()+"走了"+m+"米");
                }

            }
            sumTime = System.currentTimeMillis()-startTime;


        }
    }

结果展示

实现Runnable 接口创建多线程

案例

使用实现Runnable 接口创建多线程 来模拟 龟兔赛跑

兔子速度 8 m/ms; 乌龟 速度 2 m/ms;总长度为100米 ,当兔子跑到80米时休息了4s

代码如下

package itheima.workspace;

public class Demo2 {
    /**
     * @Author: Administrator
     * @Description: 使用 实现Runable接口 模拟龟兔赛跑
     * @Date: 2024/10/14 下午2:45
     * @Version: 1.0
     */
    public static void main(String[] args) throws InterruptedException {
        RunTask1 rabbit = new RunTask1(8,true);
        RunTask1 turtle = new RunTask1(2,false);
        Thread thread = new Thread(rabbit,"兔子");
        Thread thread1 = new Thread(turtle,"乌龟");
        //启动线程
      thread.start();
      thread1.start();
        // 等待线程结束
        thread.join();
        thread1.join();

        long time= rabbit.getSumTime();
        long time2= turtle.getSumTime();
        if (time>time2) {
            System.out.println("乌龟赢得第一名");
        }
        else {
            System.out.println("兔子赢得第一名");
        }
    }

}
class RunTask1 implements Runnable{
    private  int speed;
    private boolean isSleep;
    private long sumTime;
    public RunTask1(int speed, boolean isSleep) {
        this.speed = speed;
        this.isSleep = isSleep;
    }


    public long getSumTime() {
        return sumTime;
    }
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"以"+speed+"m/ms速度奔跑");
        long startTime = System.currentTimeMillis();
        int m=0;
        while (true) {
            if (isSleep){
                if(m==80){
                    try {
                        Thread.sleep(4000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }

            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            m=m+speed;
            if(m>=100){
                System.out.println(Thread.currentThread().getName()+"走完100米");
                break;
            }
            else {
                System.out.println(Thread.currentThread().getName()+"走了"+m+"米");
            }

        }
        sumTime = System.currentTimeMillis()-startTime;


    }
    }



结果展示

使用 Lambda 表达式 创建多线程

格式
 Thread thread = new Thread((Runnable) () -> {

        });
使用原因(如上图所示)

Lambda表达式()->{...}是一个简化的匿名内部类,它实现了Runnable接口的run方法。在上面例子中,Lambda表达式可以替代了创建一个实现了Runnable接口的类的实例的传统方式。

使用Lambda表达式 重写 龟兔赛跑
代码如下
package itheima.workspace;

public class Demo2 {
    /**
     * @Author: Administrator
     * @Description: 使用 实现Runable接口 模拟龟兔赛跑
     * @Date: 2024/10/14 下午2:45
     * @Version: 1.0
     */
    public static void main(String[] args) throws InterruptedException {
        RunTask1 rabbit = new RunTask1(8,true);
        RunTask1 turtle = new RunTask1(2,false);
        Thread thread = new Thread(() ->{
            rabbit.task();
        },"兔子");
        Thread thread1 = new Thread(()->{
            turtle.task();
        },"乌龟");
        //启动线程
      thread.start();
      thread1.start();
        // 等待线程结束
        thread.join();
        thread1.join();

        long time= rabbit.getSumTime();
        long time2= turtle.getSumTime();
        if (time>time2) {
            System.out.println("乌龟赢得第一名");
        }
        else {
            System.out.println("兔子赢得第一名");
        }
    }

}
class RunTask1 {
    private  int speed;
    private boolean isSleep;
    private long sumTime;
    public RunTask1(int speed, boolean isSleep) {
        this.speed = speed;
        this.isSleep = isSleep;
    }


    public long getSumTime() {
        return sumTime;
    }

    public void task() {
        System.out.println(Thread.currentThread().getName()+"以"+speed+"m/ms速度奔跑");
        long startTime = System.currentTimeMillis();
        int m=0;
        while (true) {
            if (isSleep){
                if(m==80){
                    try {
                        Thread.sleep(4000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }

            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            m=m+speed;
            if(m>=100){
                System.out.println(Thread.currentThread().getName()+"走完100米");
                break;
            }
            else {
                System.out.println(Thread.currentThread().getName()+"走了"+m+"米");
            }

        }
        sumTime = System.currentTimeMillis()-startTime;


    }
    }



实现Callable 接口创建多线程

案例

使用 实现Callable 接口创建多线程 来模拟 龟兔赛跑

兔子速度 8 m/ms; 乌龟 速度 2 m/ms;总长度为100米 ,当兔子跑到80米时休息了4s

代码展示

// RunTask类
package itheima.work2;

import java.util.concurrent.Callable;

public class RunTask implements Callable<Long> {
private  int step;
private boolean isSleep;
public RunTask(int step, boolean isSleep) {
    this.step = step;
    this.isSleep = isSleep;

}

    public RunTask(int step) {
          this.step = step;
    }
    @Override
    public Long call() throws Exception {
        long startTime = System.currentTimeMillis();
        int m=0;
        System.out.println(Thread.currentThread().getName()+"以"+step+"m/ms速度奔跑");
        while (true) {
            if (isSleep){
                if(m==80){
                    try {
                        Thread.sleep(4000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
            }

            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            m=m+step;
            if (m>=100){
                System.out.println(Thread.currentThread().getName()+"走完了100米");
                break;
            }
            System.out.println(Thread.currentThread().getName()+"走了"+m+"米");
        }

       return System.currentTimeMillis()-startTime;
    }
}
// Test测试类
package itheima.work2;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class Test {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        RunTask runTask = new RunTask(8,true);
        RunTask runTask1 = new RunTask(2);
        FutureTask<Long> futureTask = new FutureTask<>(runTask);
        FutureTask<Long> futureTask1 =new FutureTask<>(runTask1);

        //兔子
        Thread rabbit=new Thread(futureTask,"兔子");
        rabbit.start();
        // 乌龟
        Thread turtle=new Thread(futureTask1,"乌龟");
        turtle.start();
        Long l = futureTask.get();
        long l1 = futureTask1.get();
        if (l<l1){
            System.out.println("兔子最先跑到重点");
        }
        else {
            System.out.println("乌龟最先跑到");
        }

    }
}

结果展示

发现 时间越长,乌龟获胜可能性越大

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

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

相关文章

缺失d3dcompiler43.dll如何修复?总结5种简单方法

d3dcompiler_43.dll是Microsoft DirectX的一个关键组件&#xff0c;对于图形渲染和多媒体应用至关重要。DirectX是由微软开发的一套多媒体编程接口&#xff0c;它提供了硬件加速的图形和声音功能&#xff0c;以及其他与多媒体和游戏相关的功能。d3dcompiler_43.dll在DirectX 11…

时代在召唤—电力行业投资逻辑解析及公司参考

每个经济体不同阶段都需要有不同的蓄水池来承载社会经济增长及产业发展溢出的财富和资金&#xff0c;20多年前&#xff0c;我们选择了地产。现在地产不行了&#xff0c;必须创造新的蓄水池&#xff0c;目前来看&#xff0c;应该大力发展资本市场应该算符合当前阶段比较好的选择…

软件测试的真正目的是什么?该澄清下误解了

对测试工作目的的认识误区 在IT行业&#xff0c;其实一直对软件测试&#xff0c;测试这个工作的目的&#xff0c;一直有着不太准确的认识。 各种说法都有&#xff0c;比较流行&#xff0c;被很多IT工作甚至测试从业者认可的有下面两种&#xff1a; 测试是为了发现Bug 大家一…

音乐专辑管理系统测试报告

一、项目背景 音乐市场规模逐年扩大&#xff0c;音乐专辑管理系统是一款以音乐专辑为核心&#xff0c;为音乐产业上下游企业提供一个高效的音乐专辑管理工具&#xff0c;以便更好地管理音乐专辑&#xff0c;采用前后端分离的方法来实现&#xff0c;使用了数据库来存储相关的数…

Mac 电脑安装redis

1、首先检查电脑是否安装 brew 命令&#xff1a; #打开Mac自带的终端&#xff0c;输入下面命令 brew --version如下图&#xff0c;可以看到我的 brew 正常的&#xff0c;且对应版本是4.0.17-63-g32f2258 如果你的电脑执行上面命名报错&#xff1a;zsh: command not found: br…

海康硬盘录像机NVR与国标GB28181协议国标视频云服务平台LiteGBS的衔接

随着互联网技术的不断进步和智能终端设备的普及&#xff0c;流媒体视频平台逐渐成为数字化时代的重要产物&#xff0c;并在人们的日常生活中占据越来越重要的地位。所以经常碰到用户咨询我们&#xff0c;研发的视频平台能否支持海康的硬盘录像机接入&#xff0c;由于对现场没有…

AniVu 2.0 | 多功能RSS订阅与下载神器

AniVu是一个集RSS订阅与更新、比特洪流下载、视频播放为一体的工具。使用MVI架构&#xff0c;完全采用Material You设计风格。主要功能包括&#xff1a;订阅RSS、更新RSS、阅读RSS&#xff0c;自动更新RSS订阅&#xff0c;下载RSS文章中的BT种子或磁力链接附件&#xff0c;已下…

yolov5训练数据集

1.训练数据集 python train.py --batch-size 2 --epochs 150 --data dataset/leaf/data.yaml --weights .\weight\yolov5n6.pt训练数据集 python train.py&#xff1a;这是执行训练脚本的命令&#xff0c;其中 train.py 是 YOLOv5 模型训练脚本的名字。这个脚本位于 YOLOv5 项…

基于SpringBoot的打印店管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

『网络游戏』服务器使用PESorket【13】

下载PESorcket插件 下载网址:GitHub - PlaneZhong/PESocket: A C# Network Library. 打开PESorket的Example案例 右键PESocket 选择一个自定义的文件夹 点击生成 .dll文件生成成功 接下来新建VS工程使用PESocket 路径选择刚刚创建的Server文件夹 展示文件夹位置 删除掉Exampl…

【银行科技岗】相关考试知识点总结及部分考题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、**网络与安全**二、**软件开发与设计**三、**数据库与数据管理**四、**编程与系统**五、**计算机硬件与性能**六、**大数据与人工智能**七、**系统与应用**相关…

Matlab实现粒子群优化算法优化随机森林算法模型 (PSO-RF)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 粒子群优化算法&#xff08;PSO&#xff09;是一种启发式搜索方法&#xff0c;灵感来源于鸟类群体觅食的行为。在PSO中&#xff0c;每个解都是搜索空间中的一个“粒子”&#xff0c;这些粒子以一定的速度飞行&am…

3分钟解决Ubuntu22.04没有声音输出设备

问题背景 Ubuntu22.04在看视频时无法播放声音&#xff0c;设置中发现没有声音输出设备。 解决方法 编辑 alsa 配置文件。 # 编辑alsa 配置文件 sudo vim /etc/modprobe.d/alsa-base.conf# alsa-base.conf文件末尾添加下行内容 options snd-hda-intel dmic_detect0重启&…

华为 HCIP-Datacom H12-821 题库 (37)

&#x1f423;博客最下方微信公众号回复题库,领取题库和教学资源 &#x1f424;诚挚欢迎IT交流有兴趣的公众号回复交流群 &#x1f998;公众号会持续更新网络小知识&#x1f63c; 1.如图所示&#xff0c;R1 输出信息如下&#xff0c;则R1 邻居路由器的Router ID 为( ) 答案&…

HAL+M4学习记录_6

一、中断和事件 记录学习中断和事件的学习 1.1 NVIC&#xff08;嵌套矢量中断控制器&#xff09; NVIC管理着所有中断&#xff0c;包括核心异常。中断分为内部中断&#xff08;也称异常&#xff09;和外部中断&#xff0c;根据core_cm4.h文件&#xff0c;NVIC寄存器映射如下 …

C++ | set / map(详解)

前言 本篇博客讲解c中stl的set/map&#xff0c;本篇讲的如何使用 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见&#x1f…

R语言绘制Venn图(文氏图、温氏图、维恩图、范氏图、韦恩图)

Venn图&#xff0c;又称文氏图&#xff0c;标题中其他名字也是它的别称&#xff0c;由封闭圆形组成&#xff0c;代表不同集合。圆形重叠部分表示集合交集&#xff0c;非重叠处为独有元素。在生物学、统计学等领域广泛应用&#xff0c;可展示不同数据集相似性与差异&#xff0c;…

【hot100-java】LRU 缓存

链表篇 灵神题解 class LRUCache {private static class Node{int key,value;Node prev,next;Node (int k,int v){keyk;valuev;}}private final int capacity;//哨兵节点private final Node dummynew Node(0,0);private final Map<Integer,Node> keyToNode new HashMap&l…

【机器学习】并行计算(parallel computation)Part1

为什么我们在机器学习中需要用到并行计算呢&#xff0c;因为现在最流行的机器学习算法都是神经网络&#xff0c;神经网络模型的计算量、参数量都很大&#xff0c;比如ResNet-50参数量为25M。而我们在训练的时候使用的数据集也很大&#xff0c;比如ImageNet数据集含有14M张图片。…