【JavaSE】Java基础语法(三十四):实现多线程

文章目录

  • 1. 简单了解多线程
  • 2. 并发和并行
  • 3. 进程和线程
  • 4. 实现多线程方式一:继承Thread类【应用】
  • 5. 实现多线程方式二:实现Runnable接口【应用】
  • 6. 实现多线程方式三: 实现Callable接口【应用】
  • 7. 设置和获取线程名称【应用】
  • 8. 线程休眠【应用】
  • 9. 线程优先级【应用】
  • 10. 守护线程【应用】


在这里插入图片描述

1. 简单了解多线程


是指从软件或者硬件上实现多个线程并发执行的技术。
具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提升性能。


2. 并发和并行

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

3. 进程和线程

  • 进程:是正在运行的程序
    • 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位
    • 动态性:进程的实质是程序的一次执行过程,进程是动态产生,动态消亡的
    • 并发性:任何进程都可以同其他进程一起并发执行
  • 线程:是进程中的单个顺序控制流,是一条执行路径
    • 单线程:一个进程如果只有一条执行路径,则称为单线程程序
    • 多线程:一个进程如果有多条执行路径,则称为多线程程序

4. 实现多线程方式一:继承Thread类【应用】

  • 方法介绍
    在这里插入图片描述

  • 实现步骤
    • 定义一个类MyThread继承Thread类
    • 在MyThread类中重写run()方法
    • 创建MyThread类的对象
    • 启动线程

  • 代码演示
    public class MyThread extends Thread {
    	@Override
    	public void run() {
    		for(int i=0; i<100; i++) {
    			System.out.println(i);
    		}
    	}
    }
    
    public class MyThreadDemo {
    	public static void main(String[] args) {
    		MyThread my1 = new MyThread();
    		MyThread my2 = new MyThread();
    		// my1.run();
    		// my2.run();
    		//void start() 导致此线程开始执行; Java虚拟机调用此线程的run方法
    		my1.start();
    		my2.start();
    	}
    }
    

两个小问题

- 为什么要重写run()方法?
	- 因为run()是用来封装被线程执行的代码
- run()方法和start()方法的区别?
	- run():封装线程执行的代码,直接调用,相当于普通方法的调用
	- start():启动线程;然后由JVM调用此线程的run()方法

5. 实现多线程方式二:实现Runnable接口【应用】

  • Thread构造方法
    在这里插入图片描述

  • 实现步骤
    • 定义一个类MyRunnable实现Runnable接口
    • 在MyRunnable类中重写run()方法
    • 创建MyRunnable类的对象
    • 创建Thread类的对象,把MyRunnable对象作为构造方法的参数
    • 启动线程

  • 代码演示
    public class MyRunnable implements Runnable {
    	@Override
    	public void run() {
    		for(int i=0; i<100; i++) {
    			System.out.println(Thread.currentThread().getName()+":"+i);
    		}
    	}
    }
    
    public class MyRunnableDemo {
    	public static void main(String[] args) {
    		//创建MyRunnable类的对象
    		MyRunnable my = new MyRunnable();
    		//创建Thread类的对象,把MyRunnable对象作为构造方法的参数
    		//Thread(Runnable target)
    		// Thread t1 = new Thread(my);
    		// Thread t2 = new Thread(my);
    		//Thread(Runnable target, String name)
    		Thread t1 = new Thread(my,"坦克");
    		Thread t2 = new Thread(my,"飞机");
    		//启动线程
    		t1.start();
    		t2.start();
    	}
    }
    

6. 实现多线程方式三: 实现Callable接口【应用】

  • 方法介绍
    在这里插入图片描述

  • 实现步骤
    • 定义一个类MyCallable实现Callable接口
    • 在MyCallable类中重写call()方法
    • 创建MyCallable类的对象
    • 创建Future的实现类FutureTask对象,把MyCallable对象作为构造方法的参数
    • 创建Thread类的对象,把FutureTask对象作为构造方法的参数
    • 启动线程
    • 再调用get方法,就可以获取线程结束之后的结果。

  • 代码演示
    public class MyCallable implements Callable<String> {
    	@Override
    	public String call() throws Exception {
    		for (int i = 0; i < 100; i++) {
    			System.out.println("跟女孩表白" + i);
    		}
    		//返回值就表示线程运行完毕之后的结果
    		return "答应";
    	}
    }
    
    public class Demo {
    	public static void main(String[] args) throws ExecutionException,
    	InterruptedException {
    		//线程开启之后需要执行里面的call方法
    		MyCallable mc = new MyCallable();
    		//Thread t1 = new Thread(mc);
    		//可以获取线程执行完毕之后的结果.也可以作为参数传递给Thread对象
    		FutureTask<String> ft = new FutureTask<>(mc);
    		//创建线程对象
    		Thread t1 = new Thread(ft);
    		String s = ft.get();
    		//开启线程
    		t1.start();
    		//String s = ft.get();
    		System.out.println(s);
    	}
    }
    

三种实现方式的对比

  • 实现Runnable、Callable接口
    • 好处: 扩展性强,实现该接口的同时还可以继承其他的类
    • 缺点: 编程相对复杂,不能直接使用Thread类中的方法
  • 继承Thread类
    • 好处: 编程比较简单,可以直接使用Thread类中的方法
    • 缺点: 可以扩展性较差,不能再继承其他的类

7. 设置和获取线程名称【应用】

  • 方法介绍
    在这里插入图片描述
  • 代码演示
    public class MyThread extends Thread {
    	public MyThread() {}
    	
    	public MyThread(String name) {
    		super(name);
    	}
    	
    	@Override
    	public void run() {
    		for (int i = 0; i < 100; i++) {
    			System.out.println(getName()+":"+i);
    		}
    	}
    }
    
    public class MyThreadDemo {
    	public static void main(String[] args) {
    	MyThread my1 = new MyThread();
    	MyThread my2 = new MyThread();
    	//void setName(String name):将此线程的名称更改为等于参数 name
    	my1.setName("高铁");
    	my2.setName("飞机");
    	//Thread(String name)
    	MyThread my1 = new MyThread("高铁");
    	MyThread my2 = new MyThread("飞机");
    	my1.start();
    	my2.start();
    	//static Thread currentThread() 返回对当前正在执行的线程对象的引用
    	System.out.println(Thread.currentThread().getName());
    	}
    }
    

8. 线程休眠【应用】

  • 相关方法
    在这里插入图片描述
  • 代码演示
    public class MyRunnable implements Runnable {
    	@Override
    	public void run() {
    		for (int i = 0; i < 100; i++) {
    			try {
    				Thread.sleep(100);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    			System.out.println(Thread.currentThread().getName() + "---" + i);
    		}
    	}
    }
    
    public class Demo {
    	public static void main(String[] args) throws InterruptedException {
    		/*System.out.println("睡觉前");
    		Thread.sleep(3000);
    		System.out.println("睡醒了");*/
    		MyRunnable mr = new MyRunnable();
    		Thread t1 = new Thread(mr);
    		Thread t2 = new Thread(mr);
    		t1.start();
    		t2.start();
    	}
    }
    

9. 线程优先级【应用】

  • 线程调度

    • 两种调度方式
      • 分时调度模型:所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间
      • 抢占式调度模型:优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随
        机选择一个,优先级高的线程获取的 CPU 时间片相对多一些
    • Java使用的是抢占式调度模型
    • 随机性
      假如计算机只有一个 CPU,那么 CPU 在某一个时刻只能执行一条指令,线程只有得到CPU时间片,也就是使用权,才可以执行指令。所以说多线程程序的执行是有随机性,因为谁抢到CPU的使用权是不一定的
  • 优先级相关方法
    在这里插入图片描述

  • 代码演示

    public class MyCallable implements Callable<String> {
    	@Override
    	public String call() throws Exception {
    		for (int i = 0; i < 100; i++) {
    			System.out.println(Thread.currentThread().getName() + "---" + i);
    		}
    		return "线程执行完毕了";
    	}
    }
    
    public class Demo {
    	public static void main(String[] args) {
    	//优先级: 1 - 10 默认值:5
    	MyCallable mc = new MyCallable();
    	FutureTask<String> ft = new FutureTask<>(mc);
    	Thread t1 = new Thread(ft);
    	t1.setName("飞机");
    	t1.setPriority(10);
    	//System.out.println(t1.getPriority());//5
    	t1.start();
    	MyCallable mc2 = new MyCallable();
    	FutureTask<String> ft2 = new FutureTask<>(mc2);
    	Thread t2 = new Thread(ft2);
    	t2.setName("坦克");
    	t2.setPriority(1);
    	//System.out.println(t2.getPriority());//5
    	t2.start();
    	}
    }
    

10. 守护线程【应用】

  • 相关方法

    //`将此线程标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出
    void setDaemon(boolean on)
    
  • 代码演示

    public class MyThread1 extends Thread {
    	@Override
    	public void run() {
    		for (int i = 0; i < 10; i++) {
    			System.out.println(getName() + "---" + i);
    		}
    	}
    }
    
    public class MyThread2 extends Thread {
    	@Override
    	public void run() {
    		for (int i = 0; i < 100; i++) {
    			System.out.println(getName() + "---" + i);
    		}
    	}
    }
    
    public class Demo {
    	public static void main(String[] args) {
    		MyThread1 t1 = new MyThread1();
    		MyThread2 t2 = new MyThread2();
    		t1.setName("女神");
    		t2.setName("备胎");
    		//把第二个线程设置为守护线程
    		//当普通线程执行完之后,那么守护线程也没有继续运行下去的必要了.
    		t2.setDaemon(true);
    		t1.start();
    		t2.start();
    	}
    }
    

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Z-Library2023现状

网上基本上年年都会传出来Z-Library要被干掉的消息&#xff0c;我一直觉得&#xff0c;如果那真的发生了&#xff0c;会是人类的悲哀。 由于之前我存储的地址又挂了&#xff0c;所以紧急又寻找了一下。 1.朋友帮忙 朋友帮我搜了一下&#xff0c;发现有三个地址。 他说这第一个…

xlsx是什么格式

xlsx是什么格式? xlsx是Excel文档的扩展名&#xff0c;其基于Office Open XML标准的压缩文件格式&#xff0c;取代了其以前专有的默认文件格式&#xff0c;在传统的文件名扩展名后面添加了字母x&#xff0c;即.xlsx取代.xls。 xlsx文件是什么格式? xlsx是Excel表格的文件格…

【P34】JMeter ForEach控制器(ForEach Controller)

文章目录 一、ForEach控制器&#xff08;ForEach Controller&#xff09;参数说明二、准备工作三、测试计划设计 一、ForEach控制器&#xff08;ForEach Controller&#xff09;参数说明 可以对一个组变量进行循环迭代&#xff1b;该组件通常与后置处理器中的 JSON 提取器、正…

桥梁结构健康监测解决方案

城市桥梁担负着城市的交通和运输网络的重要角色&#xff0c;是城市生命线的重要组成部分。然而&#xff0c;随着时间的推移和日益增长的负荷&#xff0c;桥梁可能会受到各种因素的损害&#xff0c;如自然灾害、疲劳、腐蚀等。因此&#xff0c;桥梁结构健康监测变得至关重要&…

chatgpt赋能Python-python中怎么导入numpy

介绍 Python是一种广泛使用的编程语言&#xff0c;具有许多内建功能和模块&#xff0c;让开发者能够快速地编写代码。然而&#xff0c;虽然能够实现许多计算&#xff0c;但是原始Python本身并不足够处理各种科学和数字计算上需要的高效性&#xff0c;因此numpy这个开源的Pytho…

【机器学习】采样方法

文章目录 采样方法11.1 简介11.2 常见采样方法11.2.1 均匀分布采样11.2.2 逆变换采样11.2.3 拒绝采样11.2.4 重要采样11.2.5 Metropolis方法11.2.6 Metropolis-Hasting 算法11.2.7 吉布斯采样 采样方法 11.1 简介 什么是采样 从一个分布中生成一批服从该分布的样本&#xff0c…

JavaWeb ( 十 ) SpringMVC

4.Spring MVC Spring MVC是Spring提供的一个实现了Web MVC设计模式的轻量级Web框架。 三层架构分为表述层&#xff08;或表示层)、业务逻辑层、数据访问层&#xff0c;表述层表示前台页面和后台servlet 4.1.Spring MVC优点&#xff1a; ① 基于原生的Servlet&#xff0c;通过…

API测试| 了解API接口测试| API接口测试指南

什么是API&#xff1f; API是一个缩写&#xff0c;它代表了一个 pplication P AGC软件覆盖整个房间。API是用于构建软件应用程序的一组例程&#xff0c;协议和工具。API指定一个软件程序应如何与其他软件程序进行交互。 例行程序&#xff1a;执行特定任务的程序。例程也称为过…

MKS SERVO4257D 闭环步进电机_系列1 产品简介

第1部分 产品概述 1.1 产品介绍 MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口&#xff0c;RS485接口和CAN接口&#xff0c;内置高效FOC矢量算法&#xff0c;采用高精度编码器&#xff0c;通过位置反馈&#xff0c;有…

【工具】vscode的常用插件之git插件

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;善假于物&#…

进程间通信(命名管道)

目录&#xff1a; 1.命名管道 2.创建命名管道 --------------------------------------------------------------------------------------------------------------------------------- 1.命名管道 1.管道的一个应用限制就是只能在具有共同祖先&#xff08;具有亲缘关系&…

网络编程初识

如果这篇有没接触过的知识点&#xff0c;请转到网络编程先导知识_小梁今天敲代码了吗的博客-CSDN博客 目录 IPv4和IPv6的概念&#xff1a; 子网掩码 默认网关 ping命令 端口 OSI网络分层模型 TCP/IP四层模型 字节序转换函数 IP地址转换 上一篇介绍了网络编程的先导知…

2023五一赶制个人系统:基于SpringBoot+MyBatisPlus+Vue+ElementUI前后端分离

小钊记前言 &#x1f351;一、背景&#x1f351;二、调研准备阶段&#x1f34a;2.1、项目-自己搭建&#x1f353; 搭建步骤 &#x1f34a;2.2、项目需求-自己X造&#x1f34a;2.2、数据模型设计 &#x1f351;三、开发阶段&#x1f351;四、renxiaozhao 1.0.0-alpha发布&#x…

SpringBoot配置文件的注入和读取

目录 1. 配置文件的作用 2. 两种配置文件的格式&#xff1a; 2.1 properties 基本语法&#xff1a; 2.1.1 写入 2.1.2 读取 执行原理 2.1.3 缺点分析 2.2 yml 基本语法&#xff1a; 2.2.1 写入&#xff08;非对象&#xff09; 2.2.3 配置对象 2.2.4 配置集合 多个配…

Python爬虫

爬虫流程 爬虫流程&#xff1a;获取网页内容 --> 解析网页内容 --> 储存或分析数据 爬虫规则&#xff1a; 1、不要爬取公民隐私数据 2、不要爬取受著作保护的内容 3、不要爬取国家事务、国防建设、尖端科学计数领域的计算机系统等 4、请求数量和频率不能太高&…

MOTOTRBO CPS2.0安装与写频流程

一、安装MOTOTRBO CPS2.0写频软件 安装MOTOTRBO CPS2.0写频软件&#xff0c;选择安装软件的电脑系统必须WIN7以上 1.解压CPS2_2.21.61.0.zip至当前文件内 2. 双击MOTOTRBO_CPS_2.0.exe安装文件 3. 选择安装语言中文&#xff08;简体&#xff09;&#xff0c;点击确定 4.点击下一…

「实在RPA·人社数字员工」促进人力社保数字办公战略转型

一、人力社保部门数字化转型的重要性 伴随着国家放宽人力资源市场准入条例&#xff0c;多次出台相关扶持政策&#xff0c;市场竞争加剧&#xff0c;后疫情时代格局的大变局&#xff0c;如何提高服务质量和效率&#xff0c;如何降本增效&#xff0c;成为人力资源和社会保障行业…

Educational Codeforces Round 139 (Rated for Div. 2)

Educational Codeforces Round 139 (Rated for Div. 2) Problem - 1766E - Codeforces 显然我们可以把0序列的贡献单独算: i*(n-i1) 考虑只存在1,2,3的情况. 首先通过&#xff0c;观察到一个重要性质: 最多只有三种序列. 含有3或纯1或纯2型.纯1或纯2型纯2或纯1型 我们每次添加…

hugging face开源的transformers模型可快速搭建图片分类任务

2017年,谷歌团队在论文「Attention Is All You Need」提出了创新模型,其应用于NLP领域架构Transformer模型。从模型发布至今,transformer模型风靡微软、谷歌、Meta等大型科技公司。且目前有模型大一统的趋势,现在transformer 模型不仅风靡整个NLP领域,且随着VIT SWIN等变体…

什么是高性能计算实习生?做高性能计算有前景吗?

随着大模型和算力时代的大火&#xff0c;高性能计算实习的岗位越来越多了&#xff0c;各个大厂都在码人&#xff0c;百度、小米、字节、华为等等&#xff0c;也有很多网友晒出了面试一众知名芯片企业的面经和笔试题。 但是依然有很多朋友不清楚什么是高性能计算实习生&#xf…