Java多线程总结(一)

泰森多面体Voronoi 3D-V5.0 功能介绍 Abaqus Voronoi3D 阅读详情

多线程介绍

在介绍多线程之前,应该要先了解一下线程和进程的概念。

  • 进程
    进程是指正在运行的程序和程序运行时需要的系统资源。准确的说,当一个程序进入内存运行,它就变成了一个进程,并且具有一定的独立功能(这里的独立是指不同进程所占用的系统资源相对独立)。
  • 线程
    线程是进程中的一个执行单元,一个进程中至少有一个线程。线程自称不能自动运行,而必须栖身在某个进程之中,由进程触发执行。属于同一进程的所有线程共享该进程的系统资源。

从微观上讲,在单CPU的计算机内部,某一时刻只能有一个线程被执行。实现多线程就是要在宏观上使多个线程同时被执行。CPU使用抢占式调度模式在多个线程间进行高速的切换,可以使系统资源特别是CPU的利用率得到提高,整个程序的执行效率也得到了提高。下面用生活中的一个例子来说明一下

一家店有10个人在排队结账,队伍排成一列,柜台上只有一个收银员。在顾客掏钱付款这一段时间,收银员是处于空闲状态的,只有等到付款成功后才能等到下一个人。如果队伍排成两列,在一列顾客掏钱付款时,收银员可以转向另外一列,为其清点商品,不停的在两边切换,这样就能加快整个队列的速度。两个队列可以看成两个线程,收银员则可以看成CPU。

多线程实现

class Person{
    Stirng name;
    public Person(String name){
        this.name = name;
    }
    void show(){
        for(int i = 1; i<=100, i++){
            System.out.println("name="+name+",i="+i);
        }
    }
}
class ThreadDemo{
    public static void main(String[] args){
        Person p1 = new Person("张三"); //主线程开始
        Person p2 = new Person("李四");
        p1.show();
        p2.show(); //主线程结束
    }
}

执行程序时,Java虚拟机会找到 main 方法开始执行,一直到 main 方法执行完,这条路径称为Java的主线程。上面的代码中主线程要执行两次 show() 方法,共计200次循环,这时程序的执行效率显然是很低的,那么如何利用多线程来解决这个问题呢?

创建线程

创建线程一个新线程一共有两种方式

1. 继承Thread类创建线程

步骤:

  • 定义一个类继承Thread并重写Thread中的run()方法
  • 创建子类对象(即创建一个新线程)
  • 调用start()方法
代码演示:
/*
*自定义线程
*/
class MyThread extends Thread{
    @Override
    public void run(){
        for(int i = 1; i<=200; i++){
            System.out.println("自定义线程"+i);
        }
    }
}
public class Test{
    public static void main(String[] args){
        MyThread p = new MyThread(); 
        //获取开始时间
        long startTime = System.currentTimeMillis();    
        p.start();
        for(int i = 1; i<=200; i++){
            System.out.println("主线程"+i);
        }
        //获取结束时间
        long endTime = System.currentTimeMillis();
        System.out.println("程序运行时间:" + (endTime - startTime) + "ms");
    }
}

上面的代码实现了多线程,下面就具体实现原理做几点说明:

① 要执行的内容在自定义线程类的 run() 方法中,为什么不调用 run() 方法,而是去调用了 start() 方法?

线程对象的引用调用 run() 方法仅仅是普通的方法调用,不会开启新线程;而调用 start() 方法才会开启新线程。

大致过程是:调用 start() 方法开启新线程 -> 由Java虚拟机调用 run() 方法 -> 虚拟机将 run() 方法放进新线程里 -> 最后由CPU自主选择每次执行哪个线程

② 为什么要继承 Thread 类? 重写 run() 方法?

之前提到的主线程,它要执行的任务定义在一个类的 main() 方法中。自定义线程要执行的任务都定义在 run() 方法中,而 Thread 类的 run() 方法中的任务并不是我们所需要的,所以我们要写一个类继承来 Thread 类,并重写它的 run() 方法

③ 下面是多线程例子的内存图解

多线程内存图解
多线程程序执行时,每个执行线程都有一块属于自己的栈内存空间(即栈内存是线程私有的)。图中当执行到 p.start() 时开启一个新线程,在栈内存中开辟一个新空间,并调用重写的 run() 方法,压栈(新线程栈区)执行。

2. 实现 Runnable 接口创建线程

创建线程的另外一种方式是定义实现 Runnable 接口的类。

步骤:

  • 定义类实现 Runnable 接口,并覆盖接口中的 run() 方法
  • 创建 Thread 类的对象
  • 将接口的子类对象作为参数传入 Thread 类的构造函数
  • 调用 Thread 类的 start() 方法开启线程
代码演示:
/*
*自定义线程
*/
public class MyRunnable implements Runnable{
    @Override
    public void run(){
        for(int i=0; i<10; i++){
            System.out.println("自定义线程:"+i);
        }
    }
}
class test{
    public static void main(Stirng[] args){
        Runnable run = new MyRunnable();
        Thread t = new Thread(run);
        t.start();
        for (int i = 0; i < 10; i++) {
            System.out.println("main"+i);
        }
    } 
}
那么继承 Thread 类和实现 Runnable 接口有什么区别呢?

实现接口,避免了继承的单继承局限性

只有创建 Thread 类的对象,才能开启线程。线程任务定义在了 Runnable 接口实现类的重写 run() 方法里。由于 Runnable 接口没有开启线程的功能,所以只有将其实现类对象作为参数传入 Thread 类的构造函数。这样,在创建线程对象时就可以明确要执行的任务。

继承 Thread 类这种方法,将线程对象和线程任务耦合在了一起,不利于程序的设计。实现接口这种方式更加符合面向对象思想,线程分为两部分:一部分是线程对象;另一部分是线程任务(即 run() 方法中的代码),实现了很大程度上的解耦。

基于YOLOv8的铁路轨道异物检测系统设计与实现 目标检测是计算机视觉领域的核心任务之一,旨在识别图像中特定目标的位置和类别。传统方法主要依赖手工特征(如HOG、SIFT等)和分类器(如SVM),而深度学习方法通过卷积神经网络自动学习特征表示,显著提升了检测性能。YOLO(You Only Look Once)系列算法作为单阶段目标检测的代表,以其高效的检测速度著称。YOLOv8是Ultralytics公司于2023年发布的最新版本,在精度和速度上都有进一步提升。 阅读详情

相关推荐

飞塔防火墙之Link Monitor

Link Monitor类似于SLA,飞塔防火墙线路质量探测的一个功能。

weixin_41903258的博客 2406

JAVA多线程总结

1、什么是多任务 多任务就是在同一时间做多件事情,如边吃饭边玩手机等。看起来是多个任务都在做,本质上我们的大脑在同一时间依旧只做了一件件事情 2、什么是程序 程序是指令和数据的有序集合,其本身没有任何运行含义,是一个静态概念 3、什么叫进程 进程是执行程序的一次过程,它是一个动态概念,是系统资源分配的单位 小结:通常在一个进程是包含若干个线程,进程中至少有一个线程,不然没有存在的意义,线程是cpu调度和执行的单位 注:很多线程是我们模拟出来的,真是的线...

zyjdreamm的博客 2069

Codesys软运动控制进阶:用SMC_FreeEncoder为ECAT轴搭建一个“虚拟手轮”调试工具

本文详细介绍了如何利用Codesys的SMC_FreeEncoder功能为ECAT轴搭建虚拟手轮调试工具,解决自动化设备开发中的硬件依赖问题。通过软件模拟手轮脉冲信号,实现无硬件依赖的运动控制逻辑验证,显著提升调试效率。适用于汇川AM400等PLC平台,特别适合机械安装滞后或伺服驱动器故障时的调试场景。

weixin_33737774的博客 477

Java多线程总结(超详细总结)

Java多线程总结1.创建线程的方式方式1方式2方式3方式42.线程安全引出线程安全(卖票例子)解决方式方式一方式二 1.创建线程的方式 方式1 继承于Thread类 创建一个继承于Thread类的子类 重写Thread类的run() --> 将此线程执行的操作声明在run()中 创建Thread类的子类的对象 4. 通过此对象调用start() 例子:遍历100以内的所有的偶数 class MyThread extends Thread { //2. 重写Thread类的run()

唯有努力,方可自信! 7358

3分钟创建智能体

智能体简介会在首页以及名片页展示,需要简洁明了的介绍智能体用途✅优秀示例:最好用第三人称直接说明智能体用途~如:打造生动文案好帮手、专业解梦,探寻梦境奥秘等❌反面教材:简介并未介绍用途、语义含糊。如:今天写点啥、看看你做的梦等以上步骤完成后,点击发布,就能成功创建属于你自己的智能体啦~仅自己可访问(免审):发布后仅开发者本人账号可访问、预览、使用该智能体仅链接可访问:发布后任何人均可通过链接访问、预览、使用该智能体。

soso1968的博客 2084

基准电压 + 运放 + 低边MOS恒流源控制原理

因为恒流源强制 Iout不变,而 Vin​ 增加时,负载压降 Iout⋅Rload不变,多余的电压只能由MOS管的 VDS承担,因此 VDS必然增加。在饱和区,MOS 管的 ID 仅由 VGS决定,与 VDS 无关,这样,负载变化时,VDS可自由调整以维持 Iout恒定。当 Vin​ 小到无法满足 VDS>VGS−Vth时,MOS管进入线性区,Iout 会随 Vin​ 下降而减小,恒流失效。由于 Vref和 Rsense未变,Iout无需调整,运放无需动作,OUT保持不变,Iout恒定。

weixin_50643237的博客 2654

Java多线程超详细总结

多线程概述 多线程是Java的特点之一,掌握多线程编程技术,可以充分利用CPU的资源,更容易解决实际问题,并且多线程技术广泛应用于网络相关的程序设计中。 进程 进程是程序的一次动态执行过程,它对应了从代码加载、执行至完毕的一个完整过程,这个过程也是进程本身从产、发展至消亡的过程。 线程 线程是比进程更小的执行单位,一个进程在其执行过程中,可以产生多个线程,形成多条执行线索,每条线索,即每个线程,也有它自身产生、存在和消亡的过程。与进程可以共享操作系统的资源类似,线程间也可以共享进程中的某些内存单元(包括代码

star_zhang_jx的博客 1405

uni-app - 在纯 JS 文件中调用自定义弹框组件 / 封装全局 API 调用弹框组件(解决小程序、APP 无法使用 document.body.appendChild 插入组件节点)适配全端

uni-app-在纯JS文件中调用自定义弹框组件/封装全局API调用弹框组件(解决小程序、APP无法使用document.body.appendChild插入组件节点)适配全端,uni-appappendChild怎么向小程序中插入节点,如何开发类似uni.showModal全局组件。h5端可以通过document.body.appendChild挂载,请问app跟微信小程序怎么弄,请问uniapp如何封装全局api调用弹窗组件?uniapp怎么设置所有页面共用的组件Uni

🏆 前端领域优质创作者 1万+

关于java多线程实验小结_java 多线程 小结

java有点不同,实现多线程有两种方式:继承类Thread, 和 实现接口Runnable。thread类有一个run函数,它是线程的入口,当启动一个新线程是,就从这个函数开始执行;View Codepublic class ThreadTest extendsThread{public voidrun(){for (int i=0;i<5;i++){try{Thread.sleep(10...

weixin_31201481的博客 2134

Coze智能体实战:接口需求分析和接口调试

AI智能体的需求:能根据接口文档提取接口信息以及设计接口测试点,并进行接口调试返回接口测试结果。

十二测试录 282

CH7034B显示模块原理图设计,已量产

显示桥接板的价值,不在于简单把 RGB 排线换成另一种接口,而在于能否把并行视频、时钟、显示控制、模拟输出和辅助配置同时组织成稳定系统。当前这张 CH7034B 原理图就是这种思路:U3 CH7034B 作为核心桥接芯片,输入侧是 LCD_R0~R7、LCD_G0~G7、LCD_B0~B7、LCD_DE、LCD_HSYNC、LCD_VSYNC、LCD_CLK 与 LCD_BL,输出侧则通过 DAC0~DAC2 和 DDC_SC/DDC_SD 形成模拟显示接口边界。

不脱发的程序猿 161

java多线程实验报告总结,层层深入

Java并发编程技术官笔记 由于篇幅原因,我只能在文章中展示部分的章节内容和核心截图,如果你需要完整的pdf版本,可以在文末免费领取 首先给大家分享学习的思维导图,学习是需要逻辑完整的,这样才可以更高效的学习: 下面是笔记的总目录: 1,线程基础、线程之间的共享和协作 基础概念 认识Java里的线程 对Java里的线程再多-点点认识 线程间的共享和协作 面试题 CPU核心数和线程数的关系 澄清并行和并发 2,线程的并发工具类 Fork-Join CountDownLatch CyclicB

m0_57472099的博客 2392

看GRE协议的数据封装

GRE网络数据封装流程

FanFF的博客 80

【牛牛送书 | 第三期】《一本书讲透Java线程:原理与实践》带你深入JAVA多线程

互联网的每一个角落,无论是大型电商平台的秒杀活动社交平台的实时消息推送,还是在线视频平台的流量洪峰,背后都离不开多线程技术的支持。在数字化转型的过程中,高并发、高性能是衡量系统性能的核心指标,越来越多的公司对从业人员的多线程编程能力提出了更高的要求。

fckbb的博客 3734

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

《Java多线程编程核心技术》(一)多线程技能

最近阅读了一本《Java多线程编程核心技术》,总结了一下每章的知识点:第一章,java多线程技能 知识点:1,实现多线程编程的方式主要有两种:一是继承Thread类,重新run方法,二是实现Runnable接口,实现run方法,对象作为构造参数传入Thread对象进行start()启动。(第二种方式支持多继承情况)2,currentThread()方法可以返回代码段正在被哪个线程调用的信息。 Th

一名java从业者的专栏 2151

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

java多线程一

多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理“。

qq_19343089的博客 1267

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java多线程(一)

目录Java多线程(一)前言线程与进程概念关系Thread、Runnable、 Java多线程(一) 前言 线程与进程 概念 关系 Thread、Runnable、

vodkaDL的博客 3595

Java多线程详解(一)Java多线程入门

最近听很多面试的小伙伴说,网上往往是一篇一篇的Java多线程的文章,除了书籍没有什么学习多线程的一系列文章。但是仅仅凭借一两篇文章很难对多线程有系统的学习,而且面试的时候多线程这方面的知识往往也是考察的重点,所以考虑之下决定写一系列关于Java多线程的文章。文章参考了高老师的《Java多线程编程核心技术》。力争使用最短的篇幅把Java多线程的知识作以系统的讲述。 本节思维导图: 思维导图...

刘成 2475

Java:多线程实现龟兔赛跑(一)

题目 实现龟兔赛跑,使用多线程来完成 要求: 1、采用Math.random()取得0~1之间的随机数模拟比赛进程 2、总距离为100米, 3、在随机数0~0.3之间代表兔子跑 ,每次跑2米 4、在随机数0.3~1之间代表乌龟跑,每次跑1米 5、先跑完100米者为胜利者 思路 定义一个类继承Thread类,并重写里面的run方法 1、定义一个boolean类型的值flag记录比赛结果 2、定义一个distance表示比赛进程 3、重写run方法 run方法里面的内容为 1、使用while循环保证重复

lalala_dxf的博客 7642

Java多线程学习(一)Java多线程入门

转载地址:https://blog.youkuaiyun.com/qq_34337272/article/details/79640870 Java 并发的基础知识,可能会在笔试中遇到,技术面试中也可能以并发知识环节提问的第一个问题出现。比如面试官可能会问你:“谈谈自己对于进程和线程的理解,两者的区别是什么?” 一 进程和多线程简介 1.1 进程和线程 进程和线程的对比这一知识点由于过于基础,所以在面试中很...

weixin_39940206的博客 199

黑马java多线程窗口售票。窗口一重复原因

但在这里,休眠是在ticket++和打印之前,因此每次进入同步块后,线程会休眠10毫秒,然后执行票务操作。这可能增加了其他线程等待锁的时间,但由于非公平锁的特性,释放锁后,同一线程可能更容易再次获取锁,尤其是在高竞争情况下。synchronized使用的是非公平锁,这意味着当一个线程释放锁后,下一个获取锁的线程并不是按照等待顺序来分配的,而是可能由JVM和操作系统的线程调度器随机选择。因此,即使代码逻辑正确,某些线程(如窗口1)可能在竞争锁时更频繁地成功获取,导致其输出更多。

qq_70532748的博客 282

聊一聊Java多线程

Java多线程 什么是多线程? 多线程,是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。 在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。具有多线程能力的计算机因有硬件...

呼吸吐纳的博客 451

《Java多线程设计模式》笔记(一)

当年上学的时候看过《Java多线程设计模式》这本书,对书里的内容感觉是云里雾里,现在重看有种拨开云雾见天日的爽快。 有些多线程编码风格经常使用,有些是由JUC提供相应的实现。 这些是线程的基本介绍 常见的多线程编程规则与模式 ps:并行vs并发:http://developer.51cto.com/art/200908/141553.htm

New World 1367

JAVA多线程一

多线程 一一.概念进程与线程并行和并发多线程应用Slf4j的使用二.Java线程创建线程线程运行线程运行原理线程上下文切换常见方法线程状态三.并发之共享模型线程共享数据因为分时系统带来的问题阻塞式的解决方案 synchronized Lock变量的线程安全分析四.Monitor锁概念五.synchronized原理进阶 一.概念进程与线程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须要把程序加载到CPU内存,这就开启了一个进程 一个进程之内可以分为多个线程,一个线程就是一个指令流,将指令

weixin_44919936的博客 995

java多线程系列一

我相信大家或多或少在面试中都被问到这个问题,面试宝典中也有各有各种举例,比如,线程是一个应用,一个线程中包含多个线程,线程之间独立存在。这种说法没什么问题,但是我觉得,对于java语言来说,就显得很宽泛。举个栗子,我们都用编译软件写代码把,比如idea,里面很多插件,我的idea有很多插件,snoarline,或者别的,我们在写代码的同时这些插件也同时在运行,我们可以把这些插件理解为多个线程,idea这个软件理解为一个进程。

qq_39162508的博客 750

Java 多线程一

多个线程同时访问一个共享资源且存在修改该资源的操作,可能会发生数据冲突问题,但是执行读操作不会发生数据冲突。多个线程并发同时访问共享资源存在修改共享资源。

weixin_43955543的博客 166
上一篇: 浅析Java类与对象
下一篇: 从零开始构造一台二进制加法器
KKSJS
博客等级 码龄9年 16粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值