当前位置: 首页 > news >正文

多线程三种实现

多线程

线程

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。

(理解:应用软件中互相独立,可以同时运行的功能)

进程

进程是程序的基本执行实体。(理解:一个软件运行之后就是一个进程)

image-20240507230832108

多线程

有了多线程,就可以让程序同时做多件事情,就是为了提高程序的运行效率

多线程的应用场景

  • 软件中的耗时操作
  • 拷贝、迁移大文件
  • 加载大量的资源文件

并发

在同一时刻,有多个指令在单个CPU上交替执行

并行

在同一时刻,有多个指令在多个CPU上同时执行

多线程的实现方式

1.继承Thread类的方式进心实现

package xyz.dimeng.m01thread1;public class MyThread extends Thread{@Overridepublic void run() {//线程要执行的代码for (int i = 0; i < 100; i++) {System.out.println(getName()+"多线程方法"+i);}}
}
package xyz.dimeng.m01thread1;public class ThreadDemo {/**** @description 多线程的第一种启动方式:* 1.自己定义一个类继承Thread* 2.重写run方法* 3.创建子类的对象,并启动线程* @param args* @return void* @author 乔晓扑* @date 2024/5/7 23:24*/public static void main(String[] args) {MyThread t1 = new MyThread();MyThread t2 = new MyThread();t1.setName("线程1");t2.setName("线程2");t1.start();t2.start();}
}

执行结果:一会执行线程1,一会执行线程2

2.实现Runnable接口的方式进行实现

package xyz.dimeng.m02thread2;public class ThreadDemo {public static void main(String[] args) {/**** @description 多线程的第二种启动方式:* 1.自己定义一个类实现Runnable接口* 2.重写里面的run方法* 3.创建自己的类的对象* 4.创建一个Thread类的对象,并开启线程* @param args* @return void* @author 乔晓扑* @date 2024/5/7 23:38*/MyRun mr = new MyRun();Thread t1 = new Thread(mr);Thread t2 = new Thread(mr);t1.setName("线程1");t2.setName("线程2");t1.start();t2.start();}
}
package xyz.dimeng.m02thread2;public class MyRun implements Runnable{@Overridepublic void run() {//线程要执行的代码for (int i = 0; i < 100; i++) {Thread t = Thread.currentThread();System.out.println(t.getName()+"多线程方法"+i);}}
}

执行结果:一会执行线程1,一会执行线程2

3.利用Callable接口和Future接口方式实现

package xyz.dimeng.m03thread3;import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;public class ThreadDemo {public static void main(String[] args) throws ExecutionException, InterruptedException {/**** @description 多线程的第三种实现方式:*  特点:可以获取到多线程运行的结果*  1.创建一个类MyCallable实现Callable接口*  2.重写call(是有返回值的,表示多线程运行的结果)*  3.创建MyCallable对象(表示多线程要执行的任务)*  4.创建FutureTask的对象(作用管理多线程运行的结果)*  5.创建Thread类的对象,并启动* @param args* @return void* @author 乔晓扑* @date 2024/5/7 23:49*///创建MyCallable对象(表示多线程要执行的任务)MyCallable mc = new MyCallable();//创建FutureTask的对象(作用管理多线程运行的结果)FutureTask<Integer> ft  = new FutureTask<>(mc);Thread t1 = new Thread(ft);t1.start();System.out.println(ft.get());}
}
package xyz.dimeng.m03thread3;import java.util.concurrent.Callable;public class MyCallable implements Callable<Integer> {@Overridepublic Integer call() throws Exception {//求1~100的和int sum = 0;for (int i = 0; i <= 100; i++) {sum += i;}return sum;}
}

第三种可以获取到结果

第二种和第三种扩展性强可以继承其他的类

http://www.lryc.cn/news/345348.html

相关文章:

  • 【前端】HTML实现个人简历信息填写页面
  • 岩点×数说故事×小红书 | 发布《中国攀岩行业分析报告》
  • DPDK+PKTGEN环境搭建
  • 【面试干货】HTTP和HTTPS之间的主要区别
  • 04、Kafka集群安装
  • Vue自定义封装音频播放组件(带拖拽进度条)
  • php中常见的运算符和使用方法
  • 信息与未来2017真题笔记
  • 前端基础知识-ES6解构赋值(将数组内元素、字符串内字符、对象内属性值快速赋值给其他变量)
  • 【SpringBoot整合系列】SpringBoot整合RabbitMQ-消息可靠性
  • Hbase 常用shell操作
  • 数据库被攻击后出现1044 - access denied for user ‘root‘@‘% ‘ to database table
  • 在哪里打印资料比较便宜
  • leetcode 2606.找到最大开销的子字符串
  • 超标量处理器设计:重排序缓存(ROB)
  • nginx常用内置变量
  • MySQL技能树学习——数据库组成
  • OpenCV入门1:Python基础编程
  • C++ Builder XE EnumWindowsProc遍历所有窗口的名称
  • Qt QInputDialog详解
  • 最新盘点!2024年20大好用的项目管理软件(后续持续更新)
  • Linux:配置客户端默认autofs服务
  • Kotlin版本的Gradle全局配置init.gradle.kts及参考文档
  • react18【实战】tab切换,纯前端列表排序(含 lodash 和 classnames 的安装和使用)
  • C++学习第二十七课:C++ 输入输出流详解:从基础到高级应用
  • 【Unity AR开发系列】介绍如何使用这个支持热更的AR开发插件,快速地开发AR应用
  • Nginx - 配置文件结构(一)
  • 暗区突围进不去/游戏无法启动/掉帧卡顿/报错的解决方法
  • 基于FPGA的视频矩阵 视频拼接 无缝切换解决方案
  • LeetCode 513.找树左下角的值