javaSE学习笔记23-线程(thread)-总结
创建线程的三种方式
练习代码
package com.kuang.thread;import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;//回顾总结线程的创建
public class ThreadNew {public static void main(String[] args) {new MyThread1().start();//方式1,继承Thread类创建线程 可以 直接启动线程new Thread(new MyThread2()).start(); //方式2,实现runnable接口创建线程,需要一个代理Thread//方式3实现线程FutureTask<Integer> futureTask = new FutureTask<Integer>(new MyThread3());new Thread(futureTask).start();try {Integer integer = futureTask.get();System.out.println(integer);} catch (InterruptedException e) {throw new RuntimeException(e);} catch (ExecutionException e) {throw new RuntimeException(e);}}
}//方式1.继承Thread类,重写run()方法
class MyThread1 extends Thread{@Overridepublic void run() {System.out.println("第一种方式创建线程:MyThread1");}
}//方式2.实现Runnable接口,重写run()方法
class MyThread2 implements Runnable{@Overridepublic void run() {System.out.println("第二种方式创建线程:MyThread1");}
}//方式3:实现Callable接口,重写call()方法,有返回值return
class MyThread3 implements Callable{@Overridepublic Integer call() throws Exception {System.out.println("第三种方式创建线程:MyThread3");return 100;//返回100}
}
这段代码演示了 Java 中创建线程的三种不同方式,并对每种方式进行了简单的实现和调用。以下是代码的详细解释:
代码结构分析
-
ThreadNew类:-
这是程序的入口类,包含
main方法。 -
在
main方法中,分别通过三种方式创建并启动线程。
-
-
MyThread1类:-
这是第一种创建线程的方式:继承
Thread类。 -
重写了
Thread类的run方法,定义了线程执行的任务。
-
-
MyThread2类:-
这是第二种创建线程的方式:实现
Runnable接口。 -
实现了
Runnable接口的run方法,定义了线程执行的任务。
-
-
MyThread3类:-
这是第三种创建线程的方式:实现
Callable接口。 -
实现了
Callable接口的call方法,定义了线程执行的任务,并且可以返回一个结果。
-
代码执行流程
-
方式 1:继承
Thread类:-
创建
MyThread1对象并调用start方法启动线程。 -
MyThread1的run方法会被执行,输出"第一种方式创建线程:MyThread1"。new MyThread1().start();
-
方式 2:实现 Runnable 接口
-
创建
MyThread2对象,并将其作为参数传递给Thread的构造函数。 -
调用
Thread对象的start方法启动线程。 -
MyThread2的run方法会被执行,输出"第二种方式创建线程:MyThread1"。new Thread(new MyThread2()).start();
方式 3:实现 Callable 接口:
关键点
总结
这段代码展示了 Java 中创建线程的三种主要方式:
每种方式都有其适用的场景和优缺点,可以根据具体需求选择合适的方式。
-
创建
MyThread3对象,并将其作为参数传递给FutureTask的构造函数。 -
将
FutureTask对象作为参数传递给Thread的构造函数,并启动线程。 -
MyThread3的call方法会被执行,输出"第三种方式创建线程:MyThread3",并返回结果100。 -
通过
FutureTask.get()方法获取线程执行的结果,并输出该结果。FutureTask<Integer> futureTask = new FutureTask<Integer>(new MyThread3()); new Thread(futureTask).start();try {Integer integer = futureTask.get();System.out.println(integer); // 输出 100 } catch (InterruptedException | ExecutionException e) {throw new RuntimeException(e); }三种创建线程的方式对比
-
方式 1:继承
Thread类:-
优点:简单直接,适合简单的线程任务。
-
缺点:Java 是单继承的,继承
Thread类后无法再继承其他类。
-
-
方式 2:实现
Runnable接口:-
优点:更灵活,因为 Java 支持多实现,可以同时实现多个接口。
-
缺点:无法直接返回线程执行的结果。
-
-
方式 3:实现
Callable接口:-
优点:可以返回线程执行的结果,并且可以抛出异常。
-
缺点:使用稍微复杂,需要通过
FutureTask和ExecutorService来管理线程。
-
-
Thread类:-
直接继承
Thread类并重写run方法,是最基础的创建线程的方式。
-
-
Runnable接口:-
实现
Runnable接口并重写run方法,然后将Runnable对象传递给Thread构造函数。 -
这种方式更符合面向对象的设计原则,因为它将任务和线程分离。
-
-
Callable接口:-
实现
Callable接口并重写call方法,可以返回结果并抛出异常。 -
需要通过
FutureTask或ExecutorService来管理线程。
-
-
FutureTask:-
用于包装
Callable或Runnable对象,可以获取线程执行的结果。 -
通过
get方法获取结果时,会阻塞当前线程直到任务完成。
-
-
继承
Thread类:适合简单的线程任务。 -
实现
Runnable接口:更灵活,推荐使用。 -
实现
Callable接口:可以返回结果,适合需要获取线程执行结果的场景。
相关文章:
javaSE学习笔记23-线程(thread)-总结
创建线程的三种方式 练习代码 package com.kuang.thread;import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask;//回顾总结线程的创建 public class ThreadNew {public static void main(String[…...
【DeepSeek服务器部署全攻略】Linux服务器部署DeepSeek R1模型、实现API调用、搭建Web页面以及专属知识库
DeepSeek R1模型的Linux服务器搭建、API访问及Web页面搭建 1,引言2,安装Ollama工具3,下载DeepSeek R1 模型4,DeepSeek命令行对话5,DeepSeek API接口调用6,DeepSeek结合Web-ui实现图形化界面远程访问6.1&…...
【JAVA工程师从0开始学AI】,第四步:闭包与高阶函数——用Python的“魔法函数“重构Java思维
副标题:当严谨的Java遇上"七十二变"的Python函数式编程 历经变量战争、语法迷雾、函数对决,此刻我们将踏入Python最迷人的领域——函数式编程。当Java工程师还在用接口和匿名类实现回调时,Python的闭包已化身"智能机器人"…...
算法日记20:SC72最小生成树(prim朴素算法)
一、题目: 二、题解 2.1:朴素prim的步骤解析 O ( n 2 ) O(n^2) O(n2)(n<1e3) 0、假设,我们现在有这样一个有权图 1、我们随便找一个点,作为起点开始构建最小生成树(一般是1号),并且存入intree[]状态数组中…...
玩转SpringCloud Stream
背景及痛点 现如今消息中间件(MQ)在互联网项目中被广泛的应用,特别是大数据行业应用的特别的多,现在市面上也流行这多个消息中间件框架,比如ActiveMQ、RabbitMQ、RocketMQ、Kafka等,这些消息中间件各有各的优劣,但是想…...
嵌入式经常用到串口,如何判断串口数据接收完成?
说起通信,首先想到的肯定是串口,日常中232和485的使用比比皆是,数据的发送、接收是串口通信最基础的内容。这篇文章主要讨论串口接收数据的断帧操作。 空闲中断断帧 一些mcu(如:stm32f103)在出厂时就已经在…...
iOS App的启动与优化
App的启动流程 App启动分为冷启动和热启动 冷启动:从0开始启动App热启动:App已经在内存中,但是后台还挂着,再次点击图标启动App。 一般对App启动的优化都是针对冷启动。 App冷启动可分为三个阶段: dyld:…...
导出指定文件夹下的文件结构 工具模块-Python
python模块代码 import os import json import xml.etree.ElementTree as ET from typing import List, Optional, Dict, Union from pathlib import Path class DirectoryTreeExporter:def __init__(self,root_path: str,output_file: str,fmt: str txt,show_root: boo…...
Leetcode - 周赛436
目录 一、3446. 按对角线进行矩阵排序二、3447. 将元素分配给有约束条件的组三、3448. 统计可以被最后一个数位整除的子字符串数目四、3449. 最大化游戏分数的最小值 一、3446. 按对角线进行矩阵排序 题目链接 本题可以暴力枚举,在确定了每一个对角线的第一个元素…...
【pytest】编写自动化测试用例命名规范README
API_autoTest 项目介绍 1. pytest命名规范 测试文件: 文件名需要以 test_ 开头或者以 _test.py 结尾。例如,test_login.py、user_management_test.py 这样的命名方式,pytest 能够自动识别并将其作为测试文件来执行其中的测试用例。 测试类…...
Compose常用UI组件
Compose常用UI组件 概述Modifier 修饰符常用Modifier修饰符作用域限定Modifier Modifier 实现原理Modifier.Element链的构建链的解析 常用基础组件常用布局组件列表组件 概述 Compose 预置了很多基础组件,如 Button,TextField,TopAppBar等&a…...
斐波那契数列模型:在动态规划的丝绸之路上追寻斐波那契的足迹(上)
文章目录 引言递归与动态规划的对比递归解法的初探动态规划的优雅与高效自顶向下的记忆化搜索自底向上的迭代法 性能分析与比较小结 引言 斐波那契数列,这一数列如同一条无形的丝线,穿越千年时光,悄然延续其魅力。其定义简单而优美ÿ…...
Hackthebox- Season7- Titanic 简记 [Easy]
简记 ip重定向到 http://titanic.htb,先添加hosts 收集子域名 wfuzz -c -u http://titanic.htb/ -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt -H Host:FUZZ.titanic.htb --hl 9 ******************************************************** * Wfu…...
Sa-Token 根据官方文档简单实现登录认证的示例
Sa-Token 根据官方文档实现登录鉴权测试 功能实现步骤依赖配置文件启动类创建 controller启动项目测试不用密码登录查看cookie状态 密码登录查看cookie状态 修改token名称 Apipost 测试无 cookie 模式【使用 token】后端将 token 返回到前端修改代码:测试࿱…...
rustdesk编译修改名字
最近,我用Rust重写了一个2W行C代码的linux内核模块。在此记录一点经验。我此前没写过内核模块,认识比较疏浅,有错误欢迎指正。 为什么要重写? 这个模块2W行代码量看起来不多,却在线上时常故障,永远改不完。…...
BS5852英国家具防火安全条款主要包括哪几个方面呢?
什么是BS5852检测? BS5852是英国针对家用家具的强制性安全要求,主要测试家具在受到燃烧香烟和火柴等火源时的可燃性。这个标准通常分为四个部分进行测试,但实际应用中主要测试第一部分和第二部分,包括烟头测试和利用乙炔火焰模拟…...
【运维】源码编译安装cmake
背景: 已经在本地源码编译安装gcc/g,现在源码安装cmake 下载源码 下载地址:CMake - Upgrade Your Software Build System 安装步骤: ./bootstrap --prefix/usr/local/cmake make make install 错误处理 1、提示找不到libmpc.…...
检测网络安全漏洞 工具
实验一的名称为信息收集和漏洞扫描 实验环境:VMware下的kali linux2021和Windows7 32,网络设置均为NAT,这样子两台机器就在一个网络下。攻击的机器为kali,被攻击的机器为Windows 7。 理论知识记录: 1.信息收集的步骤 2.ping命令…...
frameworks 之 Activity添加View
frameworks 之 Activity添加View 1 LaunchActivityItem1.1 Activity 创建1.2 PhoneWindow 创建1.3 DecorView 创建 2 ResumeActivityItem 讲解 Activity加载View的时机和流程 涉及到的类如下 frameworks/base/core/java/android/app/Activity.javaframeworks/base/services/cor…...
UWB技术中的两种调制方式:PPM与PAM
Ultra-Wideband (UWB) 技术以其低功耗、宽频谱和高精度定位的特点,广泛应用于物联网(IoT)、智能家居、资产追踪和无线通信等领域。在UWB中,信号的调制方式对于数据传输的效率和精度起着至关重要的作用。本文将深入探讨UWB中常用的…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
