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

多线程

  • 实现多线程
    • 进程和线程的区别
    • 多线程的实现方式
      • 方式一:继承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{@Overridepublic 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{@Overridepublic 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 {@Overridepublic 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{@Overridepublic 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.rhkb.cn/news/122999.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringMvc进阶

SpringMvc进阶 SpringMVC引言一、常用注解二、参数传递三、返回值 SpringMVC引言 在Web应用程序开发中&#xff0c;Spring MVC是一种常用的框架&#xff0c;它基于MVC&#xff08;Model-View-Controller&#xff09;模式&#xff0c;提供了一种结构化的方式来构建可维护和可扩…

Json字符串内容比较-超实用版

背景 之前有类似接口diff对比&#xff0c;数据对比的测试需求&#xff0c;涉及到json格式的数据对比&#xff0c;调研了几个大神们分享的代码&#xff0c;选了一个最符合自己需求的研究了下。 说明 这个对比方法&#xff0c;支持JsonObject和JsonArray类型的数据对比&#x…

Matlab图像处理- 高斯低通滤波器

高斯低通滤波器 高斯低通滤波器是一种更平滑的一种滤波器&#xff0c;高斯低通滤波器完全没有振铃现象&#xff0c;且边缘平滑。 示例代码 利用输入图像&#xff0c;构建一个截止频率为30的高斯低通滤波器的透视图如下图所示。 M 2*size(I,1); %滤波器…

Elasticsearch脑裂

文章目录 Elasticsearch脑裂 Elasticsearch脑裂 Elasticsearch脑裂是指由于网络分区或节点间通信故障导致集群中的节点无法互相正常通信&#xff0c;从而导致数据不一致的情况。这可能会导致集群中的多个节点同时自认为是主节点&#xff08;master&#xff09;&#xff0c;并开…

javaScript:DOM中的CSS操作

目录 1.style 属性获取元素写在行间的样式 2.getComputedStyle(元素对象&#xff0c;null)可以获取元素的非行间样式 3.案例&#xff08;定义一个div和按钮&#xff0c;每点击一次按钮div宽度增加&#xff09; 效果预览图 代码实现 在 JavaScript 中&#xff0c;可以通过…

vmware设置桥接模式后ip设置

网络连接方式设置 找到虚拟机里机器的网络设置 左边是宿主机&#xff0c;右边是虚拟机&#xff0c;按照这个设置就可以上网了(IP指定一个没有占用的值&#xff0c;子网掩码和网关设置成一样的)就可以联网了。 over~~

【Linux详解】——共享内存

&#x1f4d6; 前言&#xff1a;本期介绍共享内存。 目录 &#x1f552; 1. 共享内存的原理&#x1f552; 2. 共享内存的概念&#x1f558; 2.1 接口认识&#x1f558; 2.2 演示生成key的唯一性&#x1f558; 2.3 再谈key &#x1f552; 3. 共享内存相关命令&#x1f552; 4. 利…

前端使用elementui开发后台管理系统的常用功能(持续更新)

前言&#xff1a;本次的文章完全是自己开发中遇到的一些问题&#xff0c;经过不断的修改终于完成的一些功能&#xff0c;当个快捷的查看手册吧~ elementui开发后台管理系统常用功能 高级筛选的封装elementui的表格elementui的表格实现跨页多选回显elementui的表单elementui的日…

vue3 element - plus 安装使用教程

下边是安装教程 element - plus 是针对 vue3 开发 一个 Vue 3 UI 框架 | Element Plus (element-plus.org)https://element-plus.org/zh-CN/ 安装 element - plus ui 库 # 选择一个你喜欢的包管理器# NPM $ npm install element-plus --save# Yarn $ yarn add elemen…

Verilog 基础知识

1、数值种类 Verilog HDL 有下列四种基本的值来表示硬件电路中的电平逻辑&#xff1a; 0&#xff1a;逻辑 0 或 “假”1&#xff1a;逻辑 1 或 “真”x 或 X&#xff1a;未知 x 意味着信号数值的不确定&#xff0c;即在实际电路里&#xff0c;信号可能为 1&#xff0c;也可能…

【系统设计系列】 DNS和CDN

系统设计系列初衷 System Design Primer&#xff1a; 英文文档 GitHub - donnemartin/system-design-primer: Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. 中文版&#xff1a; https://github.com/donnemarti…

【算法】堆排序 详解

堆排序 详解 堆排序代码实现 排序&#xff1a; 排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a; 假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c…

Python入门教程 | Python3 列表(List)

Python3 列表 序列是 Python 中最基本的数据结构。 序列中的每个值都有对应的位置值&#xff0c;称之为索引&#xff0c;第一个索引是 0&#xff0c;第二个索引是 1&#xff0c;依此类推。 Python 有 6 个序列的内置类型&#xff0c;但最常见的是列表和元组。 列表都可以进…

Nacos配置文件更新+热更新+多环境配置共享+集群搭建

对服务配置文件 场景&#xff1a; 如果多个服务对应的配置文件都需要更改时&#xff0c;可以利用配置管理&#xff0c;方便对配置文件进行更新&#xff0c;而且是在本地配置前先读取nacos的配置文件&#xff0c;优先级大于本地配置文件 配置步骤 1.首先在Nacos中的配置列表中增…

citavi合并重复文献题录

文章目录 一、宏macro的使用方法二、合并重复题录的macro代码2.1 下载并加载macro代码2.2 显示重复题录并合并2.3 合并的规则2.4 其他 附&#xff1a;macro代码 一、宏macro的使用方法 参考官方文档 Using macros - Citavi 6 Manual Macro files have the .cs file extension…

【ES系列】(一)简介与安装

首发博客地址 首发博客地址[1] 系列文章地址[2] 教学视频[3] 为什么要学习 ES? 强大的全文搜索和检索功能&#xff1a;Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;使用倒排索引和分布式计算等技术&#xff0c;提供了强大的全文搜索和检索功能。学习 ES 可以掌…

【性能测试】Jenkins+Ant+Jmeter自动化框架的搭建思路

前言 前面讲了Jmeter在性能测试中的应用及扩展。随着测试的深入&#xff0c;我们发现在性能测试中也会遇到不少的重复工作。 比如某新兴业务处于上升阶段&#xff0c;需要在每个版本中&#xff0c;对某些新增接口进行性能测试&#xff0c;有时还需要在一天中的不同时段分别进行…

【强化学习】MDP马尔科夫链

基本元素 状态集&#xff1a;表示智能体所处所有状态的全部可能性的集合。类似的集合&#xff0c;行为集&#xff0c;回报集决策&#xff1a;规定我在某个状态下&#xff0c;我做出某个action马尔可夫链&#xff1a;学术上来说是无记忆性质。说白了就是我只在乎我目前的状态。…

【C语言】入门——指针

目录 ​编辑 1.指针是什么 2.指针类型和指针运算 2.1指针-整数 2.2指针-指针 2.3指针的关系运算 3.野指针 3.1野指针成因 &#x1f44d;指针未初始化&#xff1a; &#x1f44d;指针越界访问&#xff1a; &#x1f44d;指针指向空间释放&#xff1a; 3.2如何规避野指针 …

超图嵌入论文阅读2:超图神经网络

超图嵌入论文阅读2&#xff1a;超图神经网络 原文&#xff1a;Hypergraph Neural Networks ——AAAI2019&#xff08;CCF-A&#xff09; 源码&#xff1a;https://github.com/iMoonLab/HGNN 500star 概述 贡献&#xff1a;用于数据表示学习的超图神经网络 (HGNN) 框架&#xf…