多线程的实现

news2024/10/6 2:30:31

目录

进程和线程

并发和并行

继承实现Runnable接口的Thread类实现的多线程

实现Runnable接口创建线程类

线程常用方法


进程和线程

进程:一个程序的启动就可以抽象化为一个进程

线程:线程是由进程开启的,一个进程可以创建多个线程,多个线程同时运行

并发和并行

并发:同一时刻,多个任务交替执行。简单说,单核CPU执行多任务就是并发。

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

并发和并行的比较:

继承实现Runnable接口的Thread类实现的多线程

  • 一个类继承Thread线程类,该类就可以当作线程类使用
  • 在继承Thread类的类中,需要重写Runnable下的run方法,在该方法的内部实现自己的业务逻辑
  • run方法会在调用start方法时由JVM隐式调用
  • 多个线程之间的逻辑会交替执行,当所有的线程逻辑执行结束后,进程才结束

继承Thread类的Fun类的功能的实现:

public class ThreadTestDrive {
    public static void main(String[] args) throws InterruptedException {
        Fun fun = new Fun();
        fun.start();    //调用start方法隐式调用run方法
        for (int j = 1; j <= 40; j++) {
            System.out.println("j" + " " + j + "---" + Thread.currentThread().getName());
            Thread.sleep(1000);
        }
    }
}

class Fun extends Thread {
    @Override
    public void run() {    //覆写run方法
        for (int i = 1; i <= 60; i++) {
            System.out.println("i" + " " + i + "---" + Thread.currentThread().getName());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

线程逻辑/多线程机制:

 为什么是start而不是run?

不妨直接调用下run方法,会发现程序总是在执行完run方法中的逻辑后才继续向下执行,在这里起始没有新线程的产生,而只是单纯的调用了fun对象的run方法:

再来看下start方法的源码:

会发现调用start方法的本质是调用了start0底层方法,start0方法由JVM调用操作特定类型操作系统中的函数完成新线程的启动,可以理解为start调用了start0方法,start0方法在底层开启新线程执行了run方法中的逻辑。值得注意的是,每一种操作系统都有自己特定的一套算法响应start0方法的逻辑。

实现Runnable接口创建线程类

有了Thread类,为什么还要有Runnable接口?

为了解决Java的单继承缺陷。如果一个类继承了除Thread类外的另一个类,那么该类就无法在继承Thread类,也就无法创建新的线程。使用Runnable接口可以解决这个问题。同时Runnable接口实现的线程类更适合于多线程共享资源的情况(t3):

实现Runnable接口创建线程类Fun:

public class RunnableTestDrive {
    public static void main(String[] args) throws InterruptedException {
        Fun fun = new Fun();//实现了Runnable接口的Fun类的实例化对象
        //静态代理
        Thread thread = new Thread(fun);
        thread.start();
        for(int i=1;i<=40;i++) {
            System.out.println(i + "===" + Thread.currentThread().getName());
            Thread.sleep(1000);
        }
    }
}

class Fun implements Runnable {
    @Override
    public void run() {
        for (int i = 1; i <= 40; i++) {
            System.out.println(i + "---" + Thread.currentThread().getName());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

Runnable创建线程的逻辑:

 模拟Thread类的静态代理作用:

class ThreadSimulate {
    private Runnable target;
    public ThreadSimulate(Runnable target) {
        this.target = target;
    }
    public void start() {
        start0();
    }
    public void start0() {
        run();
    }
    public void run() {
        if(target != null) {
            target.run();
        }
    }
}

线程常用方法

  • 线程退出
    线程退出有两种方式,run方法执行结束后退出和在外接控制变量的方式结束run方法的执行:
    public class RunMethodToSucceed implements Runnable {
        private boolean loop = true;//控制run方法中循环的变量
        @Override
        public void run() {
            while(loop) {
                System.out.println(Thread.currentThread().getName());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        public void setLoop(boolean loop) {
            this.loop = loop;
        }
    }
    
  • 线程中断
    public void isInterrupted()判断线程是否中断
    public void interrupt()中断线程的执行(提前结束线程的休眠)

  • 线程礼让
    是指将当前CPU的调度资源让给其他线程使用,当前线程等待下次调用,当CPU资源充足时,礼让可能不会起作用。
    public static void field()

  • 线程强制执行
    public void join()将当前线程的执行进程加入到线程队列的最前面,并且等到该线程执行结束后才去执行其他的线程。

  • 设置/获取线程优先级
    CPU会根据线程的优先级优先调度,那个线程的优先级高,最有可能先被调度。
    public static final int MIN_PRIORITY = 1;
    public static final int NORM_PRIORITY = 5;
    public static final int MAX_PRIORITY = 10;
    pulbic void setPriority()设置线程的优先级
    public void getPriority()获取线程的优先级

  • 线程睡眠
    pulbic static void sleep()

  • 设置守护线程
    用户/工作线程和守护线程:
    用户/工作线程:执行完任务退出或者接收到通知退出。
    守护线程:一般为工作线程服务,当所有的用户线程结束,工作线程结束,常见的守护线程有垃圾回收机制

线程的七大状态

创建状态new:在new Thread之后,没有start之前,线程都属于创建状态。

运行状态Runnable:运行状态又分为就绪ready运行running状态,这两种状态取决于CPU的调度。
阻塞状态Blocked
等待状态waitting:等待另一个线程执行特定特定动作的线程处于此状态。
超时等待状态timed waitting:等待另一个线程执行指定动作达到指定时间的线程的状态。
终止状态terminated:线程的run方法执行结束后处于的状态

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

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

相关文章

环形队列、 条带环形队列 Striped-RingBuffer (史上最全)

文章很长&#xff0c;而且持续更新&#xff0c;建议收藏起来&#xff0c;慢慢读&#xff01;疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 &#xff1a; 免费赠送 :《尼恩Java面试宝典》 持续更新 史上最全 面试必备 2000页 面试必备 大厂必备 涨薪必备 免费赠送 经典…

基于jsp+mysql+ssm项目bug修复管理系统-计算机毕业设计

项目介绍 本文主要是采用ssm的mvc技术、Mysql数据库、Tomcat服务器作为开发平台&#xff0c;系统采用B/S结构进行开发&#xff0c;完成一个项目修复管理系统&#xff0c;构建企业管理与员工任务计划相结合。提供了包括传统业务中最基本的用户注册、登录、查询、职位信息、部 门…

MicroPython-On-ESP8266——8x8LED点阵模块(3)使用MAX7219驱动

MicroPython-On-ESP8266——8x8LED点阵模块&#xff08;3&#xff09;使用MAX7219驱动 1. 新主角登场 手上有块8x8LED点阵屏&#xff0c;咱们已经了解了点阵屏的基础电路与驱动原理&#xff0c;并用两片74HC595锁存IC成功驱动点阵屏显示需要的图案。 MicroPython-On-ESP8266…

DBCO-PEG-CHO,DBCO-CHO,二苯基环辛炔-聚乙二醇-醛基

一、理论分析&#xff1a; 中文名&#xff1a;二苯基环辛炔-聚乙二醇-胆固醇&#xff0c;胆固醇偶联二苯基环辛炔&#xff0c; 二苯基环辛炔-聚乙二醇-醛基&#xff0c;点击试剂DBCO偶联醛基 英文名&#xff1a;DBCO-PEG-CHO&#xff1b; DBCO-CHO 二、结构式&#xff1a; 三…

【JavaEE】B/S结构系统的会话机制_session机制

session机制什么是会话&#xff1f;session机制为什么需要session对象来保存会话状态呢&#xff1f;只要B和S断开了&#xff0c;那么关闭浏览器这个动作&#xff0c;服务器知道吗&#xff1f;为什么不使用request(ServletRequest)对象保存会话状态&#xff1f;为什么不使用appl…

【c++实战项目】——云备份服务器

项目介绍 云备份服务器能够通过浏览器将文件上传到服务器上。并且随时可以通过浏览器进行查看并且下载&#xff0c;其中下载的过程支持断点续传。服务器上有热点管理模块&#xff0c;将非热点文件进行压缩存储&#xff0c;节省服务器的磁盘空间。服务器各个模块的功能介绍 配…

Python入门学习需要知道的100个小技巧,加了几个小时班终于整理出来了

Python新手需要知道的100个小技巧序言最后序言 哈喽兄弟们&#xff0c;今天给大家分享一下Python初学需要知道的100个小技巧~ 1、for循环中的else条件 这是一个for-else方法&#xff0c;循环遍历列表时使用else语句。下面举个例子&#xff0c;比如我们想检查一个列表中是否包…

DNSPod十问陈迪菲:从C到B,鹅厂设计师的中场战事

陈迪菲&#xff0c;腾讯云设计中心总经理&#xff0c;公司设计通道副会长&#xff0c;设计技术委员会委员&#xff0c;腾讯学院优秀讲师&#xff0c;曾于2019年获得新中国成立70周年中国用户体验设计70人提名奖。2010年加入腾讯&#xff0c;10年设计团队项目管理经验&#xff0…

C++手机运动信息管理系统

C手机运动信息管理系统 《程序设计基本能力综合实训》 实训案例名称:手机运动信息管理系统 -----说明文档 本案例主要完成手机运动信息的管理。主要功能包括:用户信息的管理、运动信息的管理、查看运动排行榜、定制运动路线、数据文件操作和退出。 如图 1-1 所示。 图1-1 …

web前端期末大作业 :HTML+CSS+JavaScript+Bootstrap实现响应式网站潮酷音乐网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

初始C语言2【函数 、数组、操作符、关键字、#define 定义常量和宏、指针、结构体】

目录 八、函数 九、数组 1、数组的定义&#xff1a;一组相同类型元素的集合 2、数组的下标 数组的每个元素都有一个下标&#xff0c;下标是从0开始的。 数组可以通过下标来访问元素。 3、数组的使用 十、操作符 1.常见操作符&#xff1a; 举例&#xff1a; 1&#xff…

与图相关的一些矩阵

目录前言正文邻接矩阵(Adjacency matrix)度矩阵(Degree matrix)关联矩阵(Incidence matrix)拉普拉斯矩阵常规拉普拉斯矩阵拉普拉斯矩阵标准化前言 以无向图为例&#xff0c;介绍与图相关的各种矩阵。我们定义下面的图为 GGG&#xff1a; import networkx as nx import matplo…

CSS之背景样式及边框样式

1、背景样式 常用属性&#xff1a; background-color&#xff1a;背景颜色background-image&#xff1a;背景图片background-repeat&#xff1a;背景图片的平铺方式background-position&#xff1a;背景图片的位置background-attachment&#xff1a;背景图随滚动条的移动方式 …

ADI Blackfin DSP处理器-BF533的开发详解19:LAN的网口设计(含源代码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 BF533说实话用来做LAN的应用有些许勉强&#xff0c;因为他自己不带网口&#xff0c;要做的话&#xff0c;需要在总线上挂&#xff0c;那…

3D视觉PnP问题

文章目录背景和定义方法分类典型方法P3P(角锥法&#xff09;DLT单应性矩阵分解迭代法EPnP其他延伸总结背景和定义 目前常用的pnp方法有很多&#xff0c;但是本人学习和查阅后发现比较零散&#xff0c;因此&#xff0c;在这里将所学习的方法按照理解分类和总结&#xff0c;并且…

体验了一下火爆全球的 ChatGPT,我惊呆了

这几天&#xff0c;要说编程圈最热的话题&#xff0c;莫过于OpenAI的ChatGPT&#xff0c;写小说&#xff0c;写代码&#xff0c;找BUG&#xff0c;写论文&#xff0c;画漫画&#xff0c;谱曲……简直没有它干不了的事。 趁着下班时间&#xff0c;我也光速注册体验了一下&#…

深度整理总结MySQL——事务专辑

事务前言什么是事务事务的特性事务的状态事务会引发什么问题&#xff1f;解决事物引发的问题手段事务日志Undo Log 日志简单介绍具体实现Buffer PoolBuffer Pool缓存什么&#xff1f;Redo Log日志为什么需要Redo Log?什么是 redo log&#xff1f;redo log要写入磁盘&#xff0…

保姆级教程:手把手教你使用 Keras 搭建神经网络

大家好&#xff0c;本文从0到1详细讲解两种基于Keras的建模方法&#xff1a; 基于Sequential的建模&#xff1b;快速方便&#xff0c;易上手 基于函数式API的建模&#xff1b;易于扩展&#xff0c;灵活性强 文章目录你会学到什么&#xff1f;技术提升导入内置数据集数据缩放和…

【GRU回归预测】基于卷积神经网络结合门控循环单元CNN-GRU实现数据多维输入单输出预测附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

ChatGPT强悍的编程能力,让我吓出一身冷汗!

最近有好几个人给我安利ChatGPT&#xff0c;说老刘快你去看看吧&#xff0c;这货实在太强了&#xff0c;搞不好我们程序员都失业了。刚开始我都是微微一笑&#xff0c;怎么可能&#xff1f;我之前的观点一直都是在我的有生之年&#xff0c;AI绝对不可能干掉程序员。但是安利的人…