Java多线程学习(一)

多线程学习(二):http://t.csdnimg.cn/Q8Koc

目录

1、什么是多线程

2、如何创建多线程(多个方法)

方法一:继承Thread类创建线程

方法二:实现Runnable接口创建线程

方法三、实现Callable接口创建线程

Thread提供的常用的线程方法


1、什么是多线程

进程的执行需要依赖线程。线程是进程的最小执行单位,每一个进程中最少有一个线程。

例如:使用某网盘下载时,当我们同时进行下载和上传操作时(同一时间同时进行),就使用到了多线程,上传是一个线程,下载也是一个线程。

使用聊天软件时,同时在收消息和发消息也用到了多线程。

我们的java程序执行main方法时就是执行了一条线程。

2、如何创建多线程(多个方法)

在java中使用的是java.lang.Thread类的对象来代表线程的。

方法一:继承Thread类创建线程

写一个main方法(main方法是由一条默认的主线程执行的)

新建一个子类MyThread并继承Thread类

在MyThread类中我们需要重写Thread中的run方法,run方法中就是我们需要在新线程中执行的代码

在run方法中我们写上一段测试代码

然后我们在main方法中创建我们的子线程对象,并调用start方法启动我们的子线程

为了对比,我们在main方法中也执行一段测试代码

运行main方法

多次执行后可以发现执行结果顺序是随机的。因为两个线程同时执行,谁先谁后不是固定的。

步骤总结:

(1)创建一个子类MyThread继承Thread类,并且重写run()方法

(2)在main方法中创建MyThread对象

(3)调用start()方法启动线程

注意:

(1)子线程的执行必须调用的是start()方法,而不是run()方法。如果调用run()方法,调用的是子线程中的run()方法,而不是启动线程,则仍然是单线程执行的。

(2)子线程启动必须在主线程任务之前。如果子线程的启动在主线程之后,主线程任务执行完之后才去启动的子线程,没有实现真正的多线程。

优缺点:

(1)编码简单

(2)线程类已经继承了Thread类,无法继承其他类,不利于扩展。

方法二:实现Runnable接口创建线程

步骤:

(1)声明一个MyRunnable任务类实现Runnable接口,重写里面的run()方法。

(2)在main方法中创建MyRunnable任务对象myRunnable

(3)新建一个线程对象,将myRunnable作为参数,调用start()方法即可

优缺点:

(1)优点:任务类只是实现接口,还可以继承其他类,实现其他接口,可扩展性强

(2)缺点:需要多一个Runnable对象

扩展:匿名内部类写法

简化写法1:

简化写法2(lambda表达式):

方法三、实现Callable接口创建线程

前面两种线程创建方式存在的问题---->线程执行完后有一些数据要返回,重写的run方法都不能直接返回结果

而利用Callable接口、FutureTask类实现的可以返回数据

步骤:

(1)创建任务对象

定义一个类实现Callable方法,重写call方法,封装要执行的代码和返回的数据

将Callable类型的对象封装程FutureTask(线程任务对象)

(2)把线程任务对象交给Thread对象

(3)调用Thread对象的start方法启动线程

(4)线程执行完之后,通过FutureTask对象的get方法获取线程任务执行的结果

优缺点:

(1)优点:线程任务只是实现接口,可以继承和实现其他接口,扩展性强。可以在线程结束后获取结果

(2)缺点:代码复杂一点

Thread提供的常用的线程方法

public void run()线程的任务发放
public void start()启动线程
public String getName() 获取当前线程的名称,线程默认名称是Thread-索引
public void setName()为线程设置名称
public static Thread currentThread()获取当前执行的线程对象
public static void sleep(long time)让当前线程休眠多少毫秒后继续执行
public final void join()让调用当前这个方法的线程先执行完

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

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

相关文章

Day46-http和www基础1

Day46-http和www基础1 1. 用户访问网站基本流程2. DNS系统解析基本流程3. DNS功能4. DNS树形结构介绍5. DNS解析流程(核心)6. 查看生产【授权DNS】并设置解析7. dig查看实际DNS解析8. 企业要不要搭建DNS服务器?9. HTTP协议10. HTTP协议版本11…

Kubernetes 编排系统

Kubernetes 编排系统 Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了一种灵活而强大的方式来管理容器化应用程序的生命周期,包括自动化部署、扩展、负载均衡、故障恢复等功能…

16、技巧之九: 修改参数,如何让表格翻页滚动到底部?【Selenium+Python3网页自动化总结】

1、问题提出 在网页配置参数时,输入参数名称搜索,搜出来的同名参数结果有多个,分布在一个表格的不同行,表格是动态加载的,需要滚动鼠标才能把所出参数找出来。用selenium怎么实现这种参数修改? 2、网页元素…

计算机网络 |内网穿透

其实内网穿透,也挺好玩的,如果在大学的时候,那个时候讲计算机网络的老师能横向延展,估计课也会更有趣不少,本来计算机网络这门课就是计算机课程中可玩性最搞的。 只能说,怪可惜的 回到正题,内网…

知名Web3投资基金a16z合伙人Jane Lippencott确认出席Hack.Summit() 2024区块链开发者大会

在区块链技术的风起云涌和Web3生态的蓬勃发展中,知名a16z Crypto的合伙人Jane Lippencott已确认出席即将于2024年4月9日至10日在香港数码港举行的Hack.Summit() 2024区块链开发者大会。作为亚洲首次举办的Hack.Summit(),此次大会将为全球区块链开发者及业…

【JavaScript知识点】预解析、作用域、数据类型、数组常用方法、字符串常用方法

JS知识点 1.预解析2.作用域:一个变量可以生效的范围,这个变量的使用范围就是作用域3.作用域访问规则4.我们的存储空间分成两种栈和堆5.数据类型分为基本数据类型和复杂数据类型6.冒泡排序和选择排序7.数组常用方法8.字符串常用方法9.json 是一种轻量级的数据交换格式…

计算机网络——物理层(数据交换方式)

计算机网络——数据交换方式 提高数据交换方式的必要性电路交换电路交换原理电路交换的阶段建立阶段通信阶段和连接拆除阶段 电路交换的优缺点报文交换什么是报文报文交换的阶段报文交换的优缺点 分组交换分组交换的阶段分组交换的优缺点 数据交换方式的选择数据报方式数据报方…

使用vue3 开发H5 ,需要注意的部分点

以下内容为使用vue3 开发H5 中碰到的几个点,个人愚见。不定期进行补充。 框架端 1. 安装 vite插件 vitejs/plugin-legacy 。 npm add -D vitejs/plugin-legacy使用: 在vite.config.js 中引入 import legacy from vitejs/plugin-legacy; export defau…

相机拍照与摄影学基础

1.相机拍照 相机可能形状和大小不同,但基本功能相同,包括快门速度、光圈和感光度,这些是摄影的通用概念。即使是一次性相机也是基于这三个理念工作的。不同类型相机在这三个概念上的唯一区别是你可以控制这些功能的程度。这三个参数被称为相…

Redis在缓存方面的应用有哪些?如何避免缓存击穿、缓存雪崩等问题?Redis如何实现分布式锁?有哪些注意事项?

Redis在缓存方面的应用有哪些?如何避免缓存击穿、缓存雪崩等问题? Redis在缓存方面的应用广泛且多样,包括但不限于以下几个方面: 页面缓存:Redis可以将Web页面的内容片段,包括HTML、CSS和图片等静态数据&a…

【ESP32接入国产大模型之MiniMax】

1. MiniMax 讲解视频: ESP32接入语言大模型之MiniMax MM智能助理是一款由MiniMax自研的,没有调用其他产品的接口的大型语言模型。MiniMax是一家中国科技公司,一直致力于进行大模型相关的研究。 随着人工智能技术的不断发展,自然语…

基于opencv的图像处理系统的设计与实现

概要 随着计算机技术的飞速发展,图像技术在各领域的研究和应用日渐深入和广泛。opencv是近年来推出的开源、免费的计算机视觉库,利用其所包含的函数可以很方便地实现数字图像处理。本文旨在对opencv进行一个快速全面简介,通过介绍图像处理的相关函数,使读…

安卓UI面试题 56-60

56. 简述IntentService原理分析 ? HandlerThread其实就是为了我们在 子线程中减少自己创建Looper以及运转Looper而出现的, 那么这次的IntentService其实封装的更巧妙,使用 HandlerThread的时候我们还需要创建Handler对象出来, 但是使用IntentService连Handler对象也不用我们…

前端小白的学习之路(HTML5 二)

提示&#xff1a;<svg>与<canvas> 目录 目录 一、svg标签 1.简介 2.常用属性 3.标签 4.使用示例 二、canvas标签 1.简介 2.常用属性与方法 3.使用示例 1)绘制基础图案 2)绘制组合图案(一个爱心) 3)做一幅动图 三、svg与canvas的区别 一、svg标签 1.简…

Kubernetes kafka系列 | k8s部署kafka+zookeepe集群(可外部通信)

直通车 zookeeper搭建 请参考yaml kafka.yaml --- apiVersion: v1 kind: Service metadata:name: kafka-hslabels:app: kafka spec:ports:- port: 9092targetPort: 9092name: serverclusterIP: Noneselector:app: kafka --- apiVersion: v1 kind: Service metadata:name: ka…

(一)、机器人时间同步方案分析

1、是否有必要进行时间同步 目前的自动驾驶系统包括 感知、定位、决策规划、控制 等模块&#xff0c;这些模块的正常运行需要依靠各种不同类型的传感器数据的准确 融合。尤其是激光雷达与相机这两种传感器在感、知定位模块中起着至关重要的作用。机械式旋转扫描激光雷达本身较低…

web canvas系列——快速入门上手绘制二维空间点、线、面

文章目录 ⭐前言⭐基本用法&#x1f496;设置一个 canvas 2D 上下文&#x1f496;绘制矩形常用方法属性&#x1f496;绘制一个红蓝交替的矩形 &#x1f496;绘制路径常用方法属性&#x1f496;画一个点&#x1f496;画一条线&#x1f496;画一个三角形面&#x1f496;画一个笑脸…

Map集合遍历键找值方式

1.4 Map集合遍历键找值方式 键找值方式&#xff1a;即通过元素中的键&#xff0c;获取键所对应的值 分析步骤&#xff1a; 获取Map中所有的键&#xff0c;由于键是唯一的&#xff0c;所以返回一个Set集合存储所有的键。方法提示:keyset()遍历键的Set集合&#xff0c;得到每一…

【leetcode热题】 两数之和 II - 输入有序数组

给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] &#xff0c;则 1 < index1 < index2 < numbers…

Rust 程序设计语言学习——所有权

这一节主要来学习 Rust 语言的其他特性&#xff0c;所有权、引用与借用、Slice 类型。 1 所有权 Rust 的核心功能&#xff08;之一&#xff09;是所有权&#xff08;ownership&#xff09;。虽然该功能很容易解释&#xff0c;但它对语言的其他部分有着深刻的影响。 所有程序…