java中多线程的3种实现方法
1.继承Thread类
优点:代码简单,可以直接使用Thread类里面的方法。
缺点:扩张性较差,应为在java中,一个类只能继承一个父类。
2.实现Runnable接口
3.实现Callable接口
2和3的优缺点是一样的
优点:扩展性强,实现该接口的同时还可以继承其他类。
缺点:代码相对来说要复杂一点,并且不能直接使用Thread类里面的方法
1.继承Thread类
package com.java.thread;public class ThreadDemo01 {public static void main(String[] args) {/*多线程的第一种实现方式是继承Thread类1.自己创建一个类来继承Thread类2.重写run方法3.创建子类对象并启动线程*/int num = 5;//井水的初始数量//创建子类对象,实例化子类对象Well oldwellZbj = new Well(num,"---猪八戒---");Well oldwellSwk = new Well(num,"***孙悟空***");//我们不使用oldwellzbj.run,因为这不是开启线程的方法//开启线程oldwellZbj.start();oldwellSwk.start();for (int i = 0; i <= num; i++) {System.out.println("当前线程:" + Thread.currentThread().getName());try {Thread.sleep(2000);//当前线程休眠2秒} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
package com.java.thread;
//创建一个类并继承Thread类
public class Well extends java.lang.Thread {private int num;//井水的数量public Well(int num, String name) {super(name);this.num = num;//初始化数量}//重写run方法,实现取水的任务public void run() {for (int i = 0; i <this.num; i++) {System.out.println(this.getName() + "取出第" + i + "桶水" + ",剩余水量:" + (this.num - i) + "桶");try {Thread.sleep(2000);//线程休眠2秒} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
2.实现Runnable接口
package com.java.thread;
//测试类
public class RunnableDemo01 {public static void main(String[] args) {/*1. 定义一个类实现Runnable接口2.利用Runnable接口的子类对象作为Thread构造方法的参数创建Thread对象3.调用Thread对象的start方法启动线程*///创建对象,我们要创建2个对象,一个是我们自己创建的类的对象,一个是Thread的对象//自己这个类表示多线程要操作的内容Runnable01 oldwell = new Runnable01(5);//井水有5桶//Thread类这个对象的创建是为了创建线程的对象Thread swk = new Thread(oldwell,"---孙悟空---");Thread zbj = new Thread(oldwell,"***猪八戒***");//调用线程的start方法swk.start();zbj.start();}
}
package com.java.thread;
//重新定义一个类实现Runnable接口
public class Runnable01 implements Runnable {private int num;//井水数量public Runnable01(int num) {this.num = num;}@Overridepublic void run() {while (true){if(num > 0){//表示水井有水System.out.println(Thread.currentThread().getName() + "开始取水\n");System.out.println("取出1桶水," + "剩余水量" + (--num) + "桶");}else{//表示水井里面没水了break;//退出循环}try {Thread.sleep(500);//线程休眠0.5秒} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
3.实现Callable接口
package com.java.thread;import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;public class CaseDemo03 {public static void main(String[] args) throws ExecutionException, InterruptedException {
/*
特点:可以获取多线程的运行结果
1.创建一个类来实现Callable接口
2.重写Callable里面的call方法(是有返回值的,表示多线程的运行结果
3.创建自己创建的那个类的对象(表示多线程要执行的任务
4.创建FutureTask的对象(管理多线程的运行结果)
(Future是一个接口,我们要创建FutureTask这个Future的实现方法的对象)
5.创建Thread类的对象,并启动线程(表示线程的启动)*///创建自己创建的那个类的对象(表示多线程要执行的任务
Case03 c = new Case03();
//创建FutureTask的对象FutureTask<Integer> ft = new FutureTask<>(c);//表示用FutureTask这个对象去管理c的结果// 创建Thread类的对象,并启动线程(表示线程的启动)new Thread(ft).start();//获取多线程的运行结果int result = ft.get();System.out.println(result);}
}
package com.java.thread;import java.util.concurrent.Callable;public class Case03 implements Callable<Integer> {
//这里的Integer表示泛型,表示多线程运行的结果@Overridepublic Integer call() throws Exception {//求1~100之间的和int sum = 0;for (int i = 0; i <= 100; i++) {sum += i;}return sum;}
}
非常感谢你可以看到这里!!!
相关文章:
java中多线程的3种实现方法
1.继承Thread类 优点:代码简单,可以直接使用Thread类里面的方法。 缺点:扩张性较差,应为在java中,一个类只能继承一个父类。 2.实现Runnable接口 3.实现Callable接口 2和3的优缺点是一样的 优点:扩展性强&…...
【Docker】docker compose服务编排
docker compose 简介 Dockerfile模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务编排。 docker swarm(管理跨节点) Dockerfile可以让用户管理一个单独的应用容器;而Compose则允许用户在一个模板(…...
elementui的el-select+el-tree+el-input实现可搜索的下拉树组件
部分实现代码如下 <template> <div><el-selectv-model"item.TableName"placeholder"请选择":disabled"!item.disabled"visible-change"handleVisible"ref"TableName"><el-input placeholder"请输…...
微信公众号排名 SEO的5个策略
随着微信公众号在社交媒体领域的持续发展和普及,如何提升公众号的搜索排名,成为许多运营者关注的焦点。公众号排名SEO,即针对微信公众号进行搜索引擎优化,旨在提高公众号在搜索结果中的曝光率和点击率。下面,我们将深入…...
python烟花代码
在Python中,可以使用多种方式来模拟烟花效果,其中一种常见的方法是使用turtle图形库来绘制。以下是一个简单的示例,展示了如何使用turtle来创建一个烟花效果的动画: import turtle import random# 设置屏幕和背景 screen turtle…...
Python高级编程
描述 集合,列表生成式,生成器,迭代器,切片 Python 中的集合类型是一种无序、不重复的数据容器,用于存储可哈希(hashable)的元素。Python 提供了两种内置的集合类型:set 和 frozens…...
leetCode75. 颜色分类
leetCode75. 颜色分类 题目思路 代码 class Solution { public:void sortColors(vector<int>& nums) {for(int i 0, j 0, k nums.size() - 1; i < k;){if(nums[i] 0) swap(nums[i],nums[j]);else if(nums[i] 2) swap(nums[i],nums[k--]);else if(nums[i] …...
选择器、pxcook软件、盒子模型
结构伪类选择器 定义:根据结构的元素关系来查找元素。 <title>Document</title><style>li:first-child{color:aqua ;}li:last-child{color: aqua;}li:nth-child(3){color: aqua;}</style> </head> <body><ul><li>…...
商城系统秒杀功能设计思想
业务特点 1、瞬时并发量大,秒杀时会有大量用户在同一时间进行抢购,瞬时并发访问量突增几倍、甚至几十倍以上 2、库存量少,一般秒杀活动商品量很少,这就导致了只有极少量用户能成功购买到。 3、业务和流程较为常见,一般…...
#初始化列表
1.再谈构造函数 1.1构造函数的组成 构造函数包括函数体赋值与初始化列表初始化。 1.2函数体赋值 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;} private:int _year;int _month;int _day; };虽然上述构造函数调用之后&…...
Vue-组件中的data
一个组件的data选项必须是一个函数。保证每个组件实例,维护独立的一份数据对象。如下图: 组件一旦封装好了,可以使用多次,比如数字框组件使用了三次: 每次创建新的组件实例,都会重新执行一次data函数&#…...
抖音小店达人佣金应该怎么结算呢?给达人设置多少佣金合适?
大家好,我是电商小V 咱们在运营抖音小店的时候一定会遇到被达人催促结算佣金的情况,咱们给达人合作的时候都会遇到过新手达人,就是给咱们直播带货之后催促咱们赶紧结算商品的佣金, 但是咱们都需要知道一点,那就是小店的…...
水稻病害检测(YOLO数据集,多分类,稻瘟病、纹枯病、褐斑病、枯心病、霜霉病、水稻细菌性条纹斑病、稻苞虫)
是自己利用LabelImg工具进行手工标注,数据集制作不易,请尊重版权(稻瘟病、纹枯病、褐斑病、枯心病、霜霉病、水稻细菌性条纹斑病、稻苞虫) 如果需要yolv8检测模型和数据集放在一起的压缩包,可以关注:最新最…...
MYSQL数据库专业术语及创建数据表详细讲解{sql语句创建数据库语句及条件子句解析,编码格式解析,创建数据表解析,表定义字段解析,主键约束解析}
MYSQL数据库中的专业术语 数据库(Database):存储数据的集合,是数据的逻辑容器。 表(Table):数据库中存储数据的结构,由行(记录)和列(字段&#x…...
Kubernetes的13个常用命令,你都熟悉吗
Kubernetes(K8s)是一个容器编排和管理工具,用于部署、管理和扩展容器化应用程序。下面是一些常用的 Kubernetes 命令及其含义: kubectl create: 创建一个资源对象,如 Pod、Deployment、Service 等。kubectl apply: 应…...
python从0开始学习(三)
目录 前言 1、类型转换 1.1 隐式类型转换 1.2 显式类型转换 2、eval函数 总结 前言 上篇我们讲了python中的变量与常量,以及变量类型。本篇文章将接着往下讲。 1、类型转换 python中的数据类型转换包括两种:隐式类型转换和显式类型转换。 1.1 隐式…...
golang判断通道chan是否关闭的2种方式
chan通道在go语言的办法编程中使用频繁,我们可以通过以下2种方式来判断channel通道是否已经关闭,1是使用 for range循环,另外是通过 for循环中if 简短语句的 逗号 ok 模式来判断。 示例代码如下: //方式1 通过for range形式判断…...
npm install 会报错npm audit错误,会提示你有多少个漏洞需要结局等
npm install 会报错 npm audit… 错误,会提示你有多少个漏洞需要结局,对应的包版本不应该低于多少等等问题 当使用npm i 命令的时候会出现以下问题 如果是个新手的话,建议直接关闭npm的audit检查。这样可以保证npm的audit不会影响你的初始…...
揭秘磁盘参数错误:数据恢复的黄金法则与预防策略
磁盘参数错误,这是一个让人头疼的电脑问题,可能会导致重要数据的丢失。不过别担心,本文将为你详细解析磁盘参数错误的来龙去脉,以及提供有效的数据恢复方法和预防措施。 一、什么是磁盘参数错误 磁盘参数错误通常指的是在读取或写…...
oracle常见操作
修改字段长度 ALTER TABLE my_table MODIFY my_column VARCHAR2(new_length);修改字段名称 ALTER TABLE my_table RENAME COLUMN old_column TO new_column;修改字段非空属性 -- 由非空改成允许为空 ALTER TABLE my_table MODIFY my_column NULL; -- 由允许为空改成非空 ALT…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
