【多线程】三种实现方案

2023-11-06

目录

1.多线程中的并发和并行概念

2.多线程中的进程和线程概念

3.多线程的实现方案

3.1.方式1:继承Thread类的方式进行实现:

3.2.方式2:实现Runnable接口

3.3.方式3:Callble和Future(可以获取返回结果)




14天阅读挑战赛

努力是为了不平庸~

1.多线程中的并发和并行概念

并行:在同一时间,有多个指令在多个CPU上同时执行

并发:在同一时刻,有多个指令在单个CPU上交替执行

2.多线程中的进程和线程概念

进程:是正在运行的软件

独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位

动态性:进程的实质是程序的一次执行过程,进程是动态产生,动态消亡的

并发性:任何进程都可以同其他进程一起并发执行

--------------------------------------------------------------------------------------------------------------------------

线程:是进程中的单个顺序控制流,是一条执行路径

单线程:一个线程如果只有一条执行路径,则称为单线程程序

多线程:一个线程如果有多条执行路径,则称为多线程程序

3.多线程的实现方案

3.1.方式1:继承Thread类的方式进行实现:

3.1.1.定义一个MyThread继承Thread类

3.1.2.在MyThread类中重写run()方法

3.1.3.创建MyThread类对象

3.1.4.启动线程

public class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("MyThread线程方法执行" + i);
        }
    }
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
    }
}

3.1.5.执行结果:

问题:

3.1.6.为什么要重写run()方法?

因为run()是用来封装被线程执行的代码。

3.1.7.run()方法和start()的区别

run():封装线程执行的代码,直接调用,相当于普通方法的调用,并没有开启线程

start():启动线程;然后由JVM调用此线程的run()方法

3.2.方式2:实现Runnable接口

定义一个类MyRunnable实现Runnable接口

在MyRunnable类中重写run()方法

创建MyRunnable类的对象

创建Thread类的对象,把MyRunnable对象作为构造方法的参数

启动线程

public class MyRunnable implements Runnable{
    @Override
    public void run() {
for (int i=0;i<10;i++){
    System.out.println("线程方法执行"+i);
}
    }
    public static void main(String[] args) {
        //创建了一个参数对象
        MyRunnable myRunnable = new MyRunnable();
        //创建了一个线程对象,并把参数传递给这个线程
        //在线程启动后,执行的就是参数里面的run方法
        Thread thread = new Thread(myRunnable);
        //run方法
        thread.start();
    }
}

运行结果:

 

3.3.方式3:Callble和Future(可以获取返回结果)

定义一个类MyCallable实现Callable接口

在MyCallable类中重写call()方法

创建MyCallable类的对象

创建Future的实现类FutureTask对象,把MyCallable对象作为构造方法的参数

创建Thread类的对象,把FutureTask对象作为构造方法的参数

启动线程

public class MyCallable implements Callable<String> {
    @Override
    public String call() throws Exception {
for (int i=0;i<100;i++){
    System.out.println("MyCallable运行次数"+i);
}
        //返回值就是表示线程运行之后的结果
        return "你好";
    }

    public static void main(String[] args) {
        //线程开启之后需要执行里面的call方法
        MyCallable myCallable = new MyCallable();
        //可以获取线程执行完毕之后的结果,也可以作为参数传递给Thread对象
        FutureTask<String> futureTask = new FutureTask<String>(myCallable);
        //创建线程对象
        Thread thread = new Thread(futureTask);
        //开启线程
        thread.start();

        try {
            //获取返回结果
            String s = futureTask.get();
            System.out.println(s);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

    }
}

调用get方法,就可以获取线程结束之后的结果,必须在线程结束之后才能获取否则只能死等线程

以上就是实现线程的三种方案

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【多线程】三种实现方案 的相关文章

随机推荐

  • QT中获取系统当前用户名

    代码 这里使用的是qgetenv 哦 感觉很简洁就记录一下 include
  • Java的基本语法

    上一篇分享了IDEA的安装 想必大家在知道我在开始学习JAVA了 今天我就来分享这几天学习Java的基本语法 Java基本语法就是指java中的规则 也是一种语言规则 规范 同时也能让您在后面的学习中避免不必要的一些错误和麻烦 是您学好ja
  • python中iloc的用法示例

    得到属性名 第一行数据 数据类型 print data iloc 0 No 1 square feet 150 loaction 4 built 10 price 6450 Name 0 dtype int64 得到属性名 第二行数据 数据
  • docker-compose部署Nginx

    docker挂载文件时会覆盖掉容器里面的目录 因此需准备一份默认的配置文件 准备配置文件 临时启动nginx容器 拷出默认配置文件 启动nginx docker run d name tmp nginx nginx latest 拷出默认配
  • cesium解决报错“DeveloperError: _workerName must be defined for asynchronous geometry”

    文章目录 1 报错问题 2 解决方法 Cesium实战系列文章总目录 传送门 1 报错问题 在使用Primitive方式加载Geojson数据时 报错An error occurred while rendering Rendering h
  • Qt窗口程序所有窗口关闭后进程不退出

    Qt窗口程序所有窗口关闭后进程不退出 Qt窗口程序在所有窗口关闭 Application对象的exec函数返回 main函数结束 程序结束 进程退出 如何实现关闭依然不退出 调用QApplication的函数 setQuitOnLastWi
  • YOLOv5-第Y1周:调用官方权重进行检测

    YOLOv5 第Y1周 调用官方权重进行检测 YOLOv5 第Y1周 调用官方权重进行检测 一 前言 二 我的环境 三 下载源码 四 运行代码 五 视频检测 八 总结 YOLOv5 第Y1周 调用官方权重进行检测 一 前言 本文为 365天
  • Java中的进制转换

    Java中的进制转换 十进制转成十六进制 Integer toHexString int i 注意转换后字母默认为小写 十进制转成八进制 Integer toOctalString int i 十进制转成二进制 Integer toBina
  • 政企云平台“一云多芯”路线全景图

    一云多芯 成为政企云平台可被信赖的关键 近年来 一云多芯 成为云计算领域的一个热词 不仅代表着云平台向着开放化标准化发展 也反应出政企守护 IT安全生命线 的刚性要求 狭义的 一云多芯 是指在一个云平台内可同时采用多种异构CPU等类型的国产
  • 【自然语言处理】条件随机场【Ⅴ】条件随机场解码问题

    有任何的书写错误 排版错误 概念错误等 希望大家包含指正 部分推导和定义相关的佐证资料比较少 供参考 讨论的过程中我会加入自己的理解 难免存在错误 欢迎大家讨论 在阅读本篇之前建议先学习 隐马尔可夫模型系列 最大熵马尔可夫模型 由于字数限制
  • 【小应用】使用深度学习和OpenCV的火灾检测系统

    文章目录 1 创建定制的CNN架构 2 创建自定义inceptionV3模型 3 实时测试 4 结论 创建自定义的InceptionV3和CNN架构用于室内和室外火灾检测 本文为翻墙阅读的国外博客的翻译 亲测代码可实现 嵌入式技术的最新进展
  • Unity脚本的Monobehavior不变绿VS无智能提示补全问题解决

    VS智能提示不出现 程序集引用为空问题解决 刚才遇到的 Unity安装了新版本 然后打开项目脚本的时候虽然还是默认VS打开 但是里面的智能提示都没有了 并且看项目方案面板里面也没有内容 这是因为新装的Unity里面默认的脚本编译器没有设置正
  • CSDN 缩进、目录、表格输入竖线或回车、字体及颜色设置

    目录 0 Markdown在线转换 1 缩进 2 目录 3 转义字符 4 字体 颜色 字号 4 1 颜色 4 2 字体 4 3 字号 4 4 背景色 5 表格 5 1 单元格对齐 5 2 合并单元格 6 数学公式 6 1 上下标 幂指数等
  • mmcls 多标签模型部署在torch serve

    GitHub仓库 gy 7 mmcls multi label torchserve github com 各个文件说明 cls requests demo 分类模型请求api服务的demo det requests demo 检测模型请求
  • linux hostname设置步骤

    查询hostname 设置步骤 其它相关点 hostid etc hosts EDA工具license破解注意事项 以RHEL 6 5为例 查询hostname uname a hostname 设置步骤 vim etc sysconfig
  • 最小年龄仅5岁!盘点全球最“天才”少年黑客 TOP 10

    你还能想起自己8岁的时候 每天都在玩什么吗 可能是在楼下和小朋友一起捉迷藏 在家追一本连载的漫画书 又或者在电脑上玩种菜偷菜的小游戏 当同龄人还在沉迷于这些比较 基础 的小游戏时 有这样一批和互联网 打交道 的少年 已经在忙着发现并修补游戏
  • ciclop读音,购机必备,15种 3D扫描 设备 优缺点汇总

    原标题 购机必备 15种 3D扫描 设备 优缺点汇总 小编总结了市场上常见的15种 可用于3D扫描的软件和设备 并详细列出有关它们的价格 优缺点等特征 以供大家在购机时有比较实用性参考 一 软件选择 根据研究表明 很多人可能不需要买一个3D
  • Android实现倒计时的几种方案

    前言 关于倒计时可以说我们App开发中常见的一种场景了 比如Splash倒计时跳转首页 比如发送短信之后倒计时60秒显示等等 关于倒计时的实现方式 大家可能有不同的做法 这里做一下总结看看你使用的是哪一种呢 一 CountDownTimer
  • 3、Nginx系列之: location和alias的区别

    Nginx系列之 location和alias的区别 一 概述 root 语法 root path 默认值 root html 配置段 http server location if alias 语法 alias path 配置段 loca
  • 【多线程】三种实现方案

    目录 1 多线程中的并发和并行概念 2 多线程中的进程和线程概念 3 多线程的实现方案 3 1 方式1 继承Thread类的方式进行实现 3 2 方式2 实现Runnable接口 3 3 方式3 Callble和Future 可以获取返回结