Java多线程(2)—线程创建

Java多线程(2)—线程创建

一、线程创建简介

在Java中,创建线程可以通过两种主要方式:继承 Thread​ 类、实现 Runnable​ 、实现Callable ​接口和线程池。

748f67c0-e1cb-4d4e-8910-22d4fe729620

二、创建方式

2.1 继承 Thread 类

示例1

♠①:创建一个类继承 Thread 类,并重写 run 方法。

package com.example.demo10.ccc;public class MyThread extends Thread{@Overridepublic void run() {for (int i = 0; i < 200; i++){System.out.println(getName() + ":打了" +i+ "个小兵");}}
}

package com.example.demo10.ccc;public class MyThreadDemo {public static void main(String[] args) {//创建两个线程对象MyThread myThread1 = new MyThread();MyThread myThread2 = new MyThread();//设置线程名字myThread1.setName("张飞");myThread2.setName("赵子龙");myThread1.start();myThread2.start();}
}

image

备注:这里如果使用run方法,是顺序执行

image

2.2 实现 Runnable 接口

♠②:创建一个类实现 Runnable 接口,并重写 run 方法。

一般使用实现Runnable接口

  • 可以避免java中的单继承的限制
  • 应该将并发运行任务和运行机制解耦,因此我们选择实现Runnable接口这种方式!

示例1

package com.example.demo10.ccc;public class MyRunnableDemo {public static void main(String[] args) {//创建MyRunnable类MyRunnable myRunnable = new MyRunnable();//创建Thread类的有参构造,并设置线程名Thread t1 = new Thread(myRunnable, "关羽");Thread t2 = new Thread(myRunnable, "吕布");//启动线程t1.start();t2.start();}
}

package com.example.demo10.ccc;public class MyRunnable implements Runnable{@Overridepublic void run() {for (int i = 0; i < 300; i++){System.out.println(Thread.currentThread().getName() + ":打了" + i+ "个兵");}}
}

image

image

2.3 实现 Callable 接口

♠③:实现 Callable 接口,重写 call 方法,这种方式可以通过 FutureTask 获取任务执行的返回值。

示例

image

package com.example.demo10.ccc.callable;import java.util.concurrent.*;public class SimpleTask implements Callable<String> {private String taskName;public SimpleTask(String name) {this.taskName = name;}@Overridepublic String call() throws Exception {return "Task " + taskName + ":执行完成";}public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(3);try {Future<String> future1 = executor.submit(new SimpleTask("A"));Future<String> future2 = executor.submit(new SimpleTask("B"));Future<String> future3 = executor.submit(new SimpleTask("C"));System.out.println(future1.get());System.out.println(future2.get());System.out.println(future3.get());} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}
}

解释:

SimpleTask

import java.util.concurrent.Callable;public class SimpleTask implements Callable<String> {private String taskName;public SimpleTask(String taskName) {this.taskName = taskName;}@Overridepublic String call() throws Exception {return "Task " + taskName + " completed";}
}
  • SimpleTask​ 类实现了 Callable<String>​ 接口,这意味着它的 call()​ 方法返回一个 String​ 类型的结果。
  • 构造函数 SimpleTask(String taskName)​ 接收一个任务名,将其存储在 taskName​ 成员变量中。

主程序 main 方法

import java.util.concurrent.*;public class SimpleTask implements Callable<String> {// SimpleTask 类的定义在这里,上面已经展示过了public static void main(String[] args) {// 创建一个固定大小为3的线程池ExecutorService executor = Executors.newFixedThreadPool(3);try {// 提交任务A,返回一个Future对象Future<String> future1 = executor.submit(new SimpleTask("A"));// 提交任务B,返回一个Future对象Future<String> future2 = executor.submit(new SimpleTask("B"));// 提交任务C,返回一个Future对象Future<String> future3 = executor.submit(new SimpleTask("C"));// 获取并打印任务A的结果System.out.println(future1.get());// 获取并打印任务B的结果System.out.println(future2.get());// 获取并打印任务C的结果System.out.println(future3.get());} catch (InterruptedException | ExecutionException e) {e.printStackTrace();} finally {// 关闭线程池executor.shutdown();}}
}

主程序执行流程说明:

  1. 创建线程池: 使用 Executors.newFixedThreadPool(3)​ 创建一个固定大小为3的线程池 executor​。

  2. 提交任务:

    • 通过 executor.submit(new SimpleTask("A"))​ 提交任务A,返回一个 Future<String>​ 对象 future1​。
    • 通过 executor.submit(new SimpleTask("B"))​ 提交任务B,返回一个 Future<String>​ 对象 future2​。
    • 通过 executor.submit(new SimpleTask("C"))​ 提交任务C,返回一个 Future<String>​ 对象 future3​。
  3. 获取结果:

    • 使用 future1.get()​ 获取并打印任务A的结果。
    • 使用 future2.get()​ 获取并打印任务B的结果。
    • 使用 future3.get()​ 获取并打印任务C的结果。
  4. 异常处理与关闭线程池:

    • 使用 try-catch​ 块捕获可能抛出的 InterruptedException​ 和 ExecutionException​ 异常。
    • finally​ 块中调用 executor.shutdown()​ 关闭线程池,确保资源被正确释放。

总结

这段代码展示了如何利用线程池和 Callable​ 接口实现并发任务的提交和执行,并且展示了如何通过 Future​ 对象获取每个任务的执行结果。这种方式能够有效地管理多个并发任务,提高程序的执行效率和性能。

2.4 使用线程池

在实际应用中,频繁地创建和销毁线程会带来性能开销,因此使用线程池是更为高效的选择。Java提供了 Executor​ 框架来管理线程池。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("Thread is running");}
}public class Main {public static void main(String[] args) {ExecutorService executorService = Executors.newFixedThreadPool(5); // 创建一个固定大小的线程池for (int i = 0; i < 10; i++) {executorService.submit(new MyRunnable()); // 提交任务}executorService.shutdown(); // 关闭线程池}
}

image

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

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

相关文章

【工程测试技术】第6章 信号处理初步,频谱分析,相关系数

目录 6.1 数字信号处理的基本步骤 6.2 离散信号及其频谱分析 6.2.1 概述 6.2.2 时域采样、混叠和采样定理 6.2.3 量化和量化误差 6.2.4 截断、泄漏和窗函数 6.2.5 频域采样、时域周期延拓和栅栏效应 6.2.6 频率分辨率、整周期截断 6.3 相关分析及其应用 6.3.1 两…

前端学习第二天笔记 CSS选择 盒子模型 浮动 定位 CSS3新特性 动画 媒体查询 精灵图雪碧图 字体图标

CSS学习 CSS选择器全局选择器元素选择器类选择器ID选择器合并选择器 选择器的优先级字体属性背景属性文本属性表格属性表格边框折叠边框表格文字对齐表格填充表格颜色 关系选择器后代选择器子代选择器相邻兄弟选择器通用兄弟选择器 CSS盒子模型弹性盒子模型父元素上的属性flex-…

STM32三种启动模式:【详细讲解】

STM32在上电后&#xff0c;从那里启动是由BOOT0和BOOT1引脚的电平决定的&#xff0c;如下表&#xff1a; BOOT模式选引脚启动模式BOOT0BOOT1X0主Flash启动01系统存储器启动11内置SRAM启动 BOOT 引脚的值在重置后 SYSCLK 的第四个上升沿时被锁定。在重置后,由用户决定是如何设…

基于springboot vue3 在线考试系统设计与实现 源码数据库 文档

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm springcloud等开发框架&#xff09; vue .net php phython node.js uniapp小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作☆☆☆ 精彩专栏推荐订阅☆☆☆☆…

基于元神操作系统实现NTFS文件操作(六)

1. 背景 本文主要介绍$Root元文件属性的解析。先介绍元文件各属性的属性体构成&#xff0c;然后结合读取到的元文件内容&#xff0c;对测试磁盘中目标分区的根目录进行展示。 2. $Root元文件属性的解析 使用每个属性头偏移0x04-0x07处的值可以从第一个属性开始依次定位下一个…

一款基于 Java 的可视化 HTTP API 接口快速开发框架,干掉 CRUD,效率爆炸(带私活源码)

平常我们经常需要编写 API&#xff0c;但其实常常只是一些简单的增删改查&#xff0c;写这些代码非常枯燥无趣。 今天给大家带来的是一款基于 Java 的可视化 HTTP API 接口快速开发框架&#xff0c;通过 UI 界面编写接口&#xff0c;无需定义 Controller、Service、Dao 等 Jav…

在线教育的未来:SpringBoot技术实现

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理微服务在线教育系统的相关信息成为必然。开…

【可答疑】基于51单片机的PWM控制智能台灯设计(含仿真、代码、报告、演示视频等)

✨哈喽大家好&#xff0c;这里是每天一杯冰美式oh&#xff0c;985电子本硕&#xff0c;大厂嵌入式在职0.3年&#xff0c;业余时间做做单片机小项目&#xff0c;有需要也可以提供就业指导&#xff08;免费&#xff09;~ &#x1f431;‍&#x1f409;这是51单片机毕业设计100篇…

什么软件能指定usb端口禁用?五款电脑USB端口禁用软件!(热门分享)

什么软件能指定usb端口禁用&#xff1f; USB端口&#xff0c;作为电脑与外部设备连接的重要接口&#xff0c;其安全性日益受到企业的重视。 为了有效防止数据泄露和未经授权的设备接入&#xff0c;指定USB端口禁用成为了许多企业的迫切需求。 本文&#xff0c;将介绍五款热门…

MySQL 用户管理

一.用户信息 MySQL中的用户&#xff0c;都存储在系统数据库mysql的user表中。 host&#xff1a; 表示这个用户可以从哪个主机登陆&#xff0c;如果是localhost&#xff0c;表示只能从本机登陆user&#xff1a; 用户名authentication_string&#xff1a; 用户密码通过password函…

Python | Leetcode Python题解之第457题环形数组是否存在循环

题目&#xff1a; 题解&#xff1a; class Solution:def circularArrayLoop(self, nums: List[int]) -> bool:n len(nums)def next(cur: int) -> int:return (cur nums[cur]) % n # 保证返回值在 [0,n) 中for i, num in enumerate(nums):if num 0:continueslow, fas…

中小企业做网站需要考虑哪些因素?

中小企业在建设网站时&#xff0c;需要考虑的因素有很多。以下是一些主要考虑因素的介绍&#xff1a; 明确建站目的&#xff1a;中小企业需要明确自己建立网站的目的。是为了展示企业形象、推广产品&#xff0c;还是提供客户服务&#xff1f;不同的目的将决定网站的设计和功能…

MOELoRA —— 多任务医学应用中的参数高效微调方法

人工智能咨询培训老师叶梓 转载标明出处 在医疗场景中&#xff0c;LLMs可以应用于多种不同的任务&#xff0c;如医生推荐、诊断预测、药物推荐、医学实体识别、临床报告生成等。这些任务的输入和输出差异很大&#xff0c;给统一模型的微调带来了挑战。而且LLMs的参数众多&…

微信朋友圈实况照片需要注意隐私

微信朋友圈现在可以发实况了。 一直不怎么发朋友圈&#xff0c;就这几天发现朋友圈可以发实况照片了。 实况照片可让用户在声音和动作丰富的互动体验中捕捉美好瞬间&#xff0c;为传统的静态照片增添活力感。 当实况照片可用时&#xff0c;“相机” App 可在用户拍照之前和之…

服务器数据恢复—raid磁盘故障导致数据库文件损坏的数据恢复案例

服务器存储数据恢复环境&故障&#xff1a; 存储中有一组由3块SAS硬盘组建的raid。上层win server操作系统层面划分了3个分区&#xff0c;数据库存放在D分区&#xff0c;备份存放在E分区。 RAID中一块硬盘的指示灯亮红色&#xff0c;D分区无法识别&#xff1b;E分区可识别&a…

Pytorch基础:网络层

文章目录 1.卷积层-Convolution Layers1.1 1d/2d/3d卷积1.2卷积--nn.Conv2d1.3转置卷积(实现上采样) 2.池化层3.线性层—Linear Layer4.激活函数层—Activate Layer 1.卷积层-Convolution Layers 卷积运算:卷积运算在输入信号(图像)上滑动,相应位置上进行乘加. 卷积核:又称过滤…

开源AI智能名片链动2+1模式S2B2C商城小程序的内容营销易读性策略

摘要&#xff1a;在数字化时代&#xff0c;内容营销已成为企业吸引用户、促进转化的关键手段。然而&#xff0c;面对“懒”这一普遍的人性弱点&#xff0c;如何使内容更加易读、减少用户思考负担&#xff0c;成为提升营销效果的重要议题。本文基于“别让我思考”的可用性设计原…

Jupyter Notebook 更换主题

1、安装 Jupyter 主题 pip install jupyterthemes 2、更新 Jupyter 主题 &#xff08;可选&#xff09; pip install --upgrade jupyterthemes 3、查看可用的 Jupyter 主题 jt -l 4、更换 Jupyter 主题 选择你喜欢的主题后&#xff0c;可以使用以下命令来应用它。更换主题后…

html+css+js实现step进度条效果

实现效果 代码实现 HTML部分 <div class"box"><ul class"step"><li class"circle actives ">1</li><li class"circle">2</li><li class"circle">3</li><li class&quo…

MySQL 表的操作

温馨提示&#xff1a;非特殊情况不要修改和删除表 创建表 第一种方式 第二种方式 第三种方式 简单查看 查看表 查询当前数据库&#xff1a;select database(); 查询当前数据库中具有的表&#xff1a;show tables; 查看表的简略信息&#xff1a;desc 表名1&#xff1b; 查看表的…