Java学习笔记——34多线程01

news2024/11/27 7:43:03

多线程

  • 实现多线程
    • 进程和线程的区别
    • 多线程的实现方式
      • 方式一:继承Thread类
        • 设置线程名称
        • 线程调度
        • 线程控制
        • 线程生命周期
      • 方式二:实现Runnable接口

实现多线程

进程和线程的区别

进程:是正在运行的程序

  • 是系统进行资源分配和调用的独立单位
  • 每一个进程都有自己的内存空间和系统资源
  • 线程:是进程中的单个顺序控制流,是一条执行路径

  • 单线程:一个进程只有一条执行路径
  • 多线程:一个进程有多条执行路径
  • 多线程的实现方式

    在java.lang下

    方式一:继承Thread类

    • 定义一个类MyThread继承Thread类
    • 在MyThread中重写run()方法,因为run()方法是用来封装被执行线程的代码
    • 创建MyThread类对象
    • 启动线程
    public class ThreadDemo {
        public static void main(String[] args){
            MyThread my1=new MyThread("杨天伦");
            MyThread my2=new MyThread("李昊");
            my1.start();
            my2.start();//void start()导致线程开始执行;java虚拟机调用此线程的run方法
        }
    }
    

    run和start的区别
    <font color=’red’> run():封装线程执行的代码,直接调用,相当于普通方法的调用
    <font color=’red’> start():启动线程;然后由JVM调用此线程的run()方法

    设置线程名称

    通过setName和getName
    带参构造方法(需要super带参调用父类构造方法)以及**Thread.currentThread().getName()**获取

    线程调度

    • 分时调度模型:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间片
    • 抢占式调度模型:优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的CPU 时间片相对多—些

    Java使用的是抢占式调度模型

    Thread类中提供两个方法用来设置和获取线程优先级
    public final int getPriority):返回此线程的优先级
    public final void setPriority(int newPriority):更改此线程的优先级

    线程的优先级有范围,最高是10,最低1,默认5
    线程优先级高仅仅表示线程获取CPU时间片的几率高,需要在次数比较多,或者多次运行时才能看到效果

    线程控制

    方法名说明
    static void sleep(long millis)使当前正在执行的线程停留(暂停执行)指定的毫秒数
    void join()等待这个进程死亡
    void setDaemon(boolean on)将此线程标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出

    sleep代码示例

    public class ThreadSleep extends Thread{
        @Override
        public void run(){
            for (int i=0;i<99;i++){
                System.out.println(getName()+":"+i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
    
    public class ThreadSleepDemo {
        public static void main(String[] args){
            ThreadSleep ts1=new ThreadSleep();
            ThreadSleep ts2=new ThreadSleep();
            ThreadSleep ts3=new ThreadSleep();
            ts1.setName("朱长坤");
            ts2.setName("李昊");
            ts3.setName("杨天伦");
    
            ts1.start();
            ts2.start();
            ts3.start();
        }
    }
    
    

    join代码示例

    public class ThreadJoin extends Thread{
        @Override
        public void run(){
            for (int i=0;i<99;i++){
                System.out.println(getName()+":"+i);
            }
        }
    }
    
    
    public class ThreadJoinDemo {
        public static void main(String[] args) {
            ThreadJoin tj1=new ThreadJoin();
            ThreadJoin tj2=new ThreadJoin();
            ThreadJoin tj3=new ThreadJoin();
    
            tj1.setName("李昊");
            tj2.setName("杨天伦");
            tj3.setName("朱长坤");
    
            tj1.start();
            try {
                tj1.join();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            tj2.start();
            tj3.start();
    
        }
    }
    

    setDaemon代码示例

    public class ThreadDaemon extends Thread {
        @Override
        public void run(){
            for (int i=0;i<99;i++){
                System.out.println(getName()+":"+i);
            }
        }
    }
    
    public class ThreadDaemonDemo {
        public static void main(String[] args) {
            ThreadDaemon td1=new ThreadDaemon();
            ThreadDaemon td2=new ThreadDaemon();
    
            td1.setName("李昊");
            td2.setName("杨天伦");
            Thread.currentThread().setName("任然");
            td1.setDaemon(true);
            td2.setDaemon(true);
            td1.start();
            td2.start();
            for (int i=0;i<9;i++){
                System.out.println(Thread.currentThread().getName()+":"+i);
            }
        }
    }
    

    线程生命周期

    线程的生命周期

    方式二:实现Runnable接口

    • 定义一个类MyRunnable实现Runnable接口
    • 在MyRunnable类中重写run()方法
    • 创建MyRunnable类的对象
    • 创建Thread类对象,把MyRunnable对象作为构造方法的参数
    • 启动线程
    public class MyRunnable implements Runnable{
        @Override
        public void run(){
            for (int i=0;i<99;i++){
                System.out.println(Thread.currentThread().getName()+":"+i);
            }
        }
    }
    
    
    public class MyRunnableDemo {
        public static void main(String[] args) {
            MyRunnable my=new MyRunnable();
    
            Thread t1=new Thread(my,"杨天伦");
            Thread t2=new Thread(my,"李昊");
            t1.start();
            t2.start();
        }
    }
    

    相比于Thread,实现Runnable接口的好处

  • 避免了Java单继承的局限性
  • 适合多个相同的程序处理同一个资源的情况,把线程和程序的代码、数据有效分离,较好地体现了面向对象的设计思想

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

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

相关文章

文章预览 安防监控/视频存储/视频汇聚平台EasyCVR播放优化小tips

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、H.265自动转码H.264、平台级联等。为了便于用户二次开发、调用与集成&#xff0c;…

IG 自动回复:提供无间断客户互动体验

图片来源于&#xff1a;SaleSmartly官网 2023&#xff0c;Instagram拥有将近13亿的月活跃用户&#xff0c;在香港拥有超过400万活跃用户。 Instagram 以图片、长短影片、直播等高互动性的互动方式&#xff0c;吸引了广大的年轻族群&#xff0c;34岁以下的用户即占比了将近全球整…

Day55|动态规划part16:583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇

583. 两个字符串的删除操作 leetcode链接&#xff1a;力扣题目链接 视频链接&#xff1a;&#xff1a;LeetCode&#xff1a;583.两个字符串的删除操 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。每步 可以删除任意一个字符串中的…

两个路由器如何连接设置的方法攻略

一、前言 随着智能家居时代来临&#xff0c;家里的网络部署需求开始复杂起来。往往一个路由器已经不能满足需求或者不利于拓展。两个路由器连接最常见的情况是家中已有一个路由器&#xff0c;并且已经通过这个路由器来正常上网。现在是因某些原因想在不改变已经在用的路由器的设…

mysql 字段用了关键字, 无法插入更新数据

1. 表字段用了关键字 explain 2. sql语句中用包裹住关键字 (注意不是单引号) <if test"explain ! null">explain,</if>

CRMEB多端多语言系统文件上传0Day代审历程

Git仓库&#xff1a; https://github.com/crmeb/CRMEB简介&#xff1a; 两天攻防中&#xff0c;某政局子公司官网后台采用的CRMEB开源商城CMS&#xff0c;挺奇葩&#xff0c;别问怎么总让我碰到这种东西&#xff0c;我也不知道&#xff0c;主打的就是一个魔幻、抽象。最后通过…

基于环形队列的生产消费模型

目录 一、信号量 1.提出问题 2.信号量的概念 3.信号量的基本操作 &#xff08;1&#xff09;PV操作 &#xff08;2&#xff09;信号量的使用 二、基于环形队列的生产消费模型 1.环形队列 &#xff08;1&#xff09;复习 &#xff08;2&#xff09;现象 &#xff08;…

酷雷曼第二期无人机技能培训圆满举办

第2期无人机技能培训 2023年8月24日-8月25日&#xff0c;第二期酷雷曼无人机技能培训及执照考试在北京圆满举办&#xff0c;来自五湖四海、全国各地的合作商千里相聚&#xff0c;培训现场热闹融洽&#xff0c;再续精彩盛况。 随着《无人驾驶航空器飞行管理暂行条例》正式发布…

Mysql中group by 使用中发现的问题

当使用 MySQL 的 GROUP BY 语句时&#xff0c;根据指定的列对结果进行分组。在 GROUP BY 分组时&#xff0c;如果某个字段在分组中有多个不同的值&#xff0c;那么就会出现你提到的该字段一直在变化的情况。 这种情况通常是由于在 GROUP BY 中选择的字段与其他非聚合字段不兼容…

【链表OJ 11】复制带随机指针的链表

前言: &#x1f4a5;&#x1f388;个人主页:​​​​​​Dream_Chaser&#xff5e; &#x1f388;&#x1f4a5; ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣上链表OJ题目 目录 leetcode138. 复制带随机指针的链表 1. 问题描述 2.代码思路: 2.1拷贝节点插入到…

操作系统强化认识之Shell编程学习与总结

目录 1.Shell的概述 2.Shell脚本入门 3.变量 3.1.系统预定义变量 3.2.自定义变量 3.3.特殊变量 4.运算符 5.条件判断 6.流程控制 6.1.if判断 6.2.case语句 6.3.for循环 6.4.while循环 7.read读取控制台输入 8.函数 8.1.系统函数 8.2.自定义函数 9.正则表示式入…

React原理 - React New Feature

目录 扩展学习资料 React Fragments/Portals/StrictMode【糖果】 Fragments【并列元素外包裹一个伪元素】 Portals【改变组件挂载节点】 Strict Mode【严格模式&#xff0c;老工程中使用&#xff0c;提示即将失效方法】 React Concurrent Mode【大招】 不可阻断渲染/可中…

【广州华锐互动】煤矿设备AR远程巡检系统实现对井下作业的远程监控和管理

煤矿井下作业环境复杂&#xff0c;安全隐患较多。传统的巡检方式存在诸多弊端&#xff0c;如巡检人员难以全面了解井下情况&#xff0c;巡检效率低下&#xff0c;安全隐患难以及时发现和整改等。为了解决这些问题&#xff0c;提高煤矿安全生产水平&#xff0c;越来越多的企业开…

C#winform自定义软键盘

软键盘应用 触摸一体机没有硬件键盘&#xff0c;系统软键盘占面积大&#xff0c;位于屏幕底部&#xff0c;点击不是很方便。某些时候只需要输入数字&#xff0c;这时弹出九宫格数字键盘就足够了。 以下实现的是弹出一个弹窗作为软键盘。 实现 创建一个窗体FrmSoftKey&#xf…

【Git-Exception】Git报错:fatal: unable to auto-detect email address

报错信息&#xff1a; *** Please tell me who you are. Run git config --global user.email “youexample.com” git config –global user.name “Your Name” to set your account’s default identity. Omit --global to set the identity only in this repository. fatal…

JVM:JIT实时编译器

一、相关 ⾼级编程语⾔按照程序的执⾏⽅式分为两种 编译型&#xff1a;一次性将代码编译为机器码解释型&#xff1a;通过解释器一句一句的将代码解释为机器码之后&#xff0c;再运行。每个语句都是执行的时候才翻译。 JAVA代码执行过程 &#xff08;编译阶段&#xff09;首先将…

SAP 物料主数据屏幕增强

增强步骤 1.为主表添加一个附加结构 根据业务需求新建一个结构&#xff0c;结构中放入需要增强的屏幕字段并激活。 打开事务代码SE11&#xff0c;在需要保存的主表中添加这个附加结构并激活。 注&#xff1a;根据业务需求及屏幕增强的视图判断需要保存的主表是哪张&#xff…

AutoSar Com模块

文章目录 Com模块功能通信传输控制整体 communication 结构Signal 发送流程设置信号的 UpdateBit信号的超时处理信号的传输方式 Signal 发送时序图Signal 接收流程接收信号的 UpdateBit Signal 接收时序图Com_TxPduInfo / Com_RxPduInfo、Com_PduGrpVector 数据来源Com_TxSigGr…

二维码生成点击按钮展示二维码

使用HBuider 1.先安装插件 &#xff08;地址 : https://ext.dcloud.net.cn/plugin?id1287&#xff09; 这里直接就安装到了uni-modules里面了 2、引入 import uQRCode from ‘/uni_modules/Sansnn-uQRCode/components/u-qrcode/u-qrcode.vue’ 3、代码实现 <template…

下载git

1.官网下载可能会有访问失败 2.用其他的镜像源下载 快 准 狠 CNPM Binaries Mirror