Java:多线程 的三种实现方法

news2024/11/25 7:04:08

文章目录

    • 什么是多线程
    • 多线程 三种 实现方法
      • 继承 Thread 的方法
      • 实现 Runnable接口 的方法
      • 实现 Callable接口 并利用 FutureTask类 来接收返回值 的方法
      • 我的理解 和 总结

什么是多线程

简单理解:进程就是一个运行的软件,而线程是软件中的一个功能,多个功能就组成了多线程。
作用:提高了运行效率。

多线程 三种 实现方法

继承 Thread 的方法

  1. 自定义类继承 Thread 重写run方法
  2. new子类,然后调用 start() 方法,启动线程
  3. 对象setName(“线程1”) 可以设置线程名字,在类中可以用getName() 来获取

例子:

package com.study;
// 自定义类继承 Thread
public class MyThread extends Thread{

	// 重写run方法
    @Override
    public void run() {
        super.run();
        for (int i = 0; i < 100; i++) {
            System.out.println(getName() + ": helloworld");
        }
    }
}
package com.study;

public class ThreadDemo {
    public static void main(String[] args) {

		// new子类
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
		// 设置线程名字
        t1.setName("线程1");
        t2.setName("线程2");

		// 调用 start() 方法,启动线程
        t1.start();
        t2.start();
    }
}

运行截图:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实现 Runnable接口 的方法

  1. 定义一个类实现Runnable接口
  2. 重写run方法
  3. 创建自己的类对象
  4. 创建Thread对象,开启线程

注意:也可以setName,但是要记住,这种方法,类中不能直接使用getName方法,因为并没有继承Thread,自然类中没有此方法。但是可以在类中获取当前正在运行线程的对象,来获取name。

例子:

package com.study.threaddemo2;
// 定义一个类实现Runnable接口
public class MyRun implements Runnable{

	// 重写run方法
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            Thread h = Thread.currentThread(); // 获取当前线程的对象
            System.out.println(h.getName() + ":helloworld");
        }
    }
}
package com.study.threaddemo2;

public class Test2 {
    public static void main(String[] args) {

		// 创建自己的类对象 
        MyRun r1 = new MyRun();
        MyRun r2 = new MyRun();

		// 创建Thread对象
        Thread t1 = new Thread(r1);
        Thread t2 = new Thread(r2);
		// 设置线程名字
        t1.setName("线程1");
        t2.setName("线程2");
		// 开启线程
        t1.start();
        t2.start();
    }
}

运行截图:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实现 Callable接口 并利用 FutureTask类 来接收返回值 的方法

  1. 实现Callable接口
  2. 重写call方法,有返回值
  3. 创建自己类的对象
  4. 创建FutureTask对象(管理多线程运行结果)
  5. 创建Thread类对象且启动

注意:Callable泛型,填入返回的类型。

例子:

package com.study.threaddemo3;

import java.util.concurrent.Callable;
// 实现Callable接口
public class MyCallable implements Callable<Integer> {

	// 重写call方法
    public Integer call() {
        int sum = 0;
        for (int i = 0; i < 100; i++) {
            sum += i;
        }
        return sum;
    }
}
package com.study.threaddemo3;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class Test3 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
		
		// 创建自己类的对象
        MyCallable mc = new MyCallable();

		// 创建FutureTask对象
        FutureTask<Integer> ft = new FutureTask<>(mc);

		// 创建Thread类对象且启动
        Thread t1 = new Thread(ft);	
        t1.start();

		// 获取返回值
        Integer res = ft.get();
        System.out.println(res);
    }
}

运行结果:
在这里插入图片描述

我的理解 和 总结

继承Thread类 的方法,实际就是自己创建了一个流水线,并同时创建了任务,也就是流水线运输和处理的内容。 自然我们可以在流水线中知道此流水线的名字。

实现Runnable接口 的方法,实际是创建了一个任务,我们还需要创建流水线,去运行此任务。 我们不能根据任务就知道运行此任务的流水线名字,因为可能有多个流水线执行此任务,所以我们要先获取正在执行此任务的流水线,这样就能知道正在运行的流水线名了,因为并发只能有一条流水线正在运行。

实现Callable接口 的方法,此方法就可以用FutureTask这个员工来获得流水线处理任务后的结果(返回值),弥补了上面两种方法的不足。

这样解释是不是很好理解呢?当然这只是通俗的解释一下,方便理解,具体原理肯定还是要看代码的。

可以根据每种方法的优缺点来进行选择使用。
在这里插入图片描述

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

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

相关文章

解决服务端渲染程序SSR运行时报错: ReferenceError: document is not defined

现象&#xff1a; 原因&#xff1a; 该错误表明在服务端渲染 (SSR) 过程中&#xff0c;有一些代码尝试在没有浏览器环境的情况下执行与浏览器相关的操作。这在服务端渲染期间是一个常见的问题&#xff0c;因为在服务端渲染期间是没有浏览器 API。 解决办法&#xff1a; 1. 修…

比例压力阀电子控制器DBET-6X/315YG24K4V

DBET-6X/350G24K4V、DBET-61/315YG24K4V、DBET-6X/200G24K4V比例阀放大器模块将啮合在符合EN60715标准的导轨上。通过各端口的插入式螺钉连接器进行电气连接。该模块以24VDC直流电压运行。内部供电设备提供了所有内部所需的正和负电源电压。 该放大器装在一个支架道轨上&#…

可编程电子负载的应用前景如何

可编程电子负载是一种模拟真实负载的电子设备&#xff0c;它可以模拟各种不同类型和规格的负载&#xff0c;如电阻、电容、电感等。通过可编程的方式&#xff0c;用户可以根据需要灵活地调整负载的大小、电压、电流等参数&#xff0c;以满足不同的测试需求。随着科技的不断发展…

软件工程之系统质量

从公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一 、质量标准化 1.什么是质量标准化 通过标准化各条业务线的研发流程&#xff0c;以做的比较好的业务线作为标准样板间&#xff0c;规范出一套标…

【PyQt学习篇 · ⑫】:QVBoxLayout和QHBoxLayout布局管理器的使用

文章目录 QVBoxLayout和QHBoxLayout的介绍.addStretch()的使用方法.setSpacing()方法的使用.setAlignment()的使用.setFixedSize()的使用QMainWindow中使用布局管理器 QVBoxLayout和QHBoxLayout的介绍 QVBoxLayout 和 QHBoxLayout 是 PyQt 中用于实现垂直和水平布局的两个布局…

平台工程文化:软件开发的创新路径和协作之道

在快速发展的软件开发领域&#xff0c;具有前瞻性思维的企业组织正在拥抱平台工程文化的变革力量。这种创新方法强调创建共享平台、工具和实践&#xff0c;使开发人员能够更快、更高效地交付高质量的软件。在本文中&#xff0c;我们将深入探讨平台工程文化的核心原则和深远的好…

【Docker】从零开始:15.搭建亿级数据Redis集群之哈希算法概念

【Docker】从零开始&#xff1a;15.搭建亿级数据Redis集群之哈希算法概念篇 概述一般业界的3种解决方案1.哈希取余分区优点&#xff1a;缺点&#xff1a; 2.一致性哈希算法分区背景目的原理一致性哈希环节点映射key落到服务器的落键规则 优点容错性扩展性 缺点 3.哈希槽分区背景…

4WRPH6C3B24L-2X/G24Z4/M伺服比例方向阀控制板

4WRPH6C3B12L-2X/G24Z4/M、4WRPH6C3B40P-2X/G24Z4/M、4WRPH6C3B40L-2X/G24Z4/M、4WRPH6C4B24L-2X/G24Z4/M、4WRPH6C4B40L-2X/G24Z4/M、4WRPH6C3B24L-2X/G24Z4/M、4WRPH10C4B100L-2X/G24Z4/M、4WRPH10C3B100L-2X/G24K0/M-750适合控制4WRPH系列比例伺服阀&#xff0c;用于安装在架…

AOP记录操作日志

创建数据库表 -- 操作日志 create table operate_log (id int unsigned primary key auto_increment commentid,operate_user int unsigned comment 操作人员Id,operate_time datetime comment 操作时间,class_name varchar(100)comment 操作类,method_name varchar(100)comme…

全国各省市城市地级市自治州盟地区369个城市年度平均气温数据(2001-2022年)

这份包含369个城市平均气温数据的数据集&#xff08;2001-2022年&#xff09;是基于美国国家海洋和大气管理局&#xff08;NOAA&#xff09;下属国家环境信息中心&#xff08;NCEI&#xff09;提供的原始数据编制而成的。利用气象观测站点的这些栅格图和全国地级市的行政边界数…

ospf选路

问题描述 R6通过主备份路径访问LSP&#xff08;R1&#xff09;&#xff0c;主为R2&#xff0c; 备为R3 解决方案 路由器1看作LSP&#xff0c;配置loopback 0 ,地址为1.1.1.1 供测试使用&#xff1b;路由器 236, LSW4和LSW5&#xff0c; 运行ospf处于相同区域&#xff0c;建立…

【SpringCloud篇】Eureka服务的基本配置和操作

文章目录 &#x1f339;简述Eureka&#x1f6f8;搭建Eureka服务⭐操作步骤⭐服务注册⭐服务发现 &#x1f339;简述Eureka Eureka是Netflix开源的一个基于REST的服务治理框架&#xff0c;主要用于实现微服务架构中的服务注册与发现。它由Eureka服务器和Eureka客户端组成&#…

怎么安装Element组件库?

先创建一个项目 1.现在桌面创建一个文件夹 2.窗口里面输入vue ui&#xff0c;打开vue图形页面 3.创建项目 4.接下来只要等待就行了 到这里很多人会发现自己没有NPM脚本这个女选项&#xff0c;这时候我们要点击package.json他才会出来 到此&#xff0c;就已经创建好了 &#…

幽灵鲨crm助力企业轻松进行客户管理

当今竞争激烈的商业环境中&#xff0c;有效的客户管理是企业成功的关键之一。幽灵鲨CRM应运而生&#xff0c;致力于为企业提供便捷、智能的客户管理解决方案&#xff0c;助您轻松驾驭客户关系&#xff0c;开拓更广阔的市场。 解放您的管理压力 幽灵鲨CRM集客户信息、沟通记录、…

C++中单引号‘‘和双引号““的区别

操作系统&#xff1a;Windows 10 IDE&#xff1a;CLion 单引号&#xff1a;表示一个字符&#xff0c;例如 a 双引号""&#xff1a;表示一个字符串&#xff0c;例如 "a" 在C中&#xff0c;使用双引号可以方便地创建字符串&#xff0c;而使用单引号可以方便…

C++基础 -45- 类的静态数据成员

类的静态成员不包含在对象空间内 举例验证 定义普通变量和静态的变量 输出可知静态成员并没有占用类空间 静态数据成员的赋值&#xff08;必须类外赋值&#xff09; int base:: b 100;静态数据成员的访问&#xff08;不需要先定义对象&#xff09; int main() {cout <…

算法通关村——原来这就是堆

堆结构是一种非常重要的基础数据结构&#xff0c;也是算法的重要内容&#xff0c;很多题目甚至只能用堆来进行&#xff0c;所以我们必须先明确什么类型的题目可以用堆&#xff0c;以及如何使用堆来解决。由于堆的构造和维护过程都非常复杂&#xff0c;因此面试时一般不需要手写…

28、pytest实战:获取多用户鉴权

前提 测试过程中有用户体系&#xff0c;例如包括管理员、商家、用户角色&#xff0c;不同测试用例需要使用不同角色来操作&#xff0c;操作权限根据用户的鉴权来判断实现。 技能点 建立全局变量文件&#xff0c;保存账号相关信息获取鉴权信息变为module级别fixture&#xff…

Linux-centos上如何配置管理NFS服务器?

Linux/centos上如何配置管理NFS服务器&#xff1f; 1 NFS基础了解 NFS&#xff08;Network File System&#xff09;即文件操作系统&#xff1b;NFS允许网络中不同计算机相互之间共享资源。 1.1 NFS概述 1980年由SUN发展出来的在UNIX&Linux系统间实现文件共享的一种方法…

语音验证码有什么好处?

在互联网时代&#xff0c;验证码的重要性不言而喻&#xff01;网站或APP注册登录、密码修改、在线支付等场景均需通过验证码确认系用户本人&#xff0c;以保障用户帐户信息及财产安全。 常见的验证码是短信验证码&#xff0c;而语音验证码因其是语音电话自动播报的形式&#x…