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{
    @Override
    public void run() {
        System.out.println("第一种方式创建线程:MyThread1");
    }
}

//方式2.实现Runnable接口,重写run()方法
class MyThread2 implements Runnable{

    @Override
    public void run() {
        System.out.println("第二种方式创建线程:MyThread1");
    }
}

//方式3:实现Callable接口,重写call()方法,有返回值return
class MyThread3 implements Callable{
    @Override
    public Integer call() throws Exception {
        System.out.println("第三种方式创建线程:MyThread3");
        return 100;//返回100
    }
}

这段代码演示了 Java 中创建线程的三种不同方式,并对每种方式进行了简单的实现和调用。以下是代码的详细解释:


代码结构分析

  1. ThreadNew 类

    • 这是程序的入口类,包含 main 方法。

    • 在 main 方法中,分别通过三种方式创建并启动线程。

  2. MyThread1 类

    • 这是第一种创建线程的方式:继承 Thread 类

    • 重写了 Thread 类的 run 方法,定义了线程执行的任务。

  3. MyThread2 类

    • 这是第二种创建线程的方式:实现 Runnable 接口

    • 实现了 Runnable 接口的 run 方法,定义了线程执行的任务。

  4. MyThread3 类

    • 这是第三种创建线程的方式:实现 Callable 接口

    • 实现了 Callable 接口的 call 方法,定义了线程执行的任务,并且可以返回一个结果。


代码执行流程

  1. 方式 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 接口:可以返回结果,适合需要获取线程执行结果的场景。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【微中子代理踩坑-前端node-sass安装失败】

微中子代理踩坑-前端node-sass安装失败-windows 1.npm版本2.python2.73.安装Visual Studio 1.npm版本 当前使用node版本13.12.0 2.python2.7 安装python2.7.9并配置环境变量 3.安装Visual Studio 安装Visual Studio 我是直接勾选了3个windows的sdk,然后就好了 最后 npm in…

一文了解PLM项目管理系统

PLM项目管理系统详解 PLM项目管理系统的定义和功能 PLM&#xff08;Product Lifecycle Management&#xff0c;产品生命周期管理&#xff09;项目管理系统是一种全面管理产品从概念设计、开发、制造、服务到最终退役全过程的软件系统。该系统通过集成产品数据、工作流程、人员…

Pycharm+CodeGPT+Ollama+Deepseek

首先&#xff0c;体验截图&#xff1a; 接着&#xff1a; 1、下载Ollama&#xff1a; Download Ollama on macOS 2、下载模型 以1.5b为例&#xff0c;打开命令行&#xff0c;输入: ollama run deepseek-r1:1.5b 3、Pycharm安装Code GPT插件 打开PyCharm&#xff0c;找到文…

Netty入门详解

引言 Netty 是一个基于 Java 的高性能、异步事件驱动的网络应用框架&#xff0c;用于快速开发可维护的高性能网络服务器和客户端。它提供了一组丰富的 API&#xff0c;使得开发人员能够轻松地处理各种网络协议&#xff0c;如 TCP、UDP 等&#xff0c;并且支持多种编解码方式&a…

【C++】优先级队列宝藏岛

> &#x1f343; 本系列为初阶C的内容&#xff0c;如果感兴趣&#xff0c;欢迎订阅&#x1f6a9; > &#x1f38a;个人主页:[小编的个人主页])小编的个人主页 > &#x1f380; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 > ✌️ &#x1f91e; &#x1…

【分布式理论11】分布式协同之分布式事务(一个应用操作多个资源):从刚性事务到柔性事务的演进

文章目录 一. 什么是分布式事务&#xff1f;二. 分布式事务的挑战三. 事务的ACID特性四. CAP理论与BASE理论1. CAP理论1.1. 三大特性1.2. 三者不能兼得 2. BASE理论 五. 分布式事务解决方案1. 两阶段提交&#xff08;2PC&#xff09;2. TCC&#xff08;Try-Confirm-Cancel&…

Linux-C/C++《C++/1、C++基础》(C++语言特性、面向对象等)

这里主要介绍概念为主&#xff0c;主要介绍 C与 C 语言中常用的不同点&#xff0c;和一些新的变化。其中不会去说指针、数据类型、变量类型、判断和循环等这些知识&#xff0c;这些和C 语言基本是一样使用的。我们主要学习 C的面向对象编程&#xff0c;对学习 Qt 有很大的帮助。…

我国首条大型无人机城际低空物流航线成功首航

首航震撼开场&#xff1a;羊肉 “飞” 越 540 公里 在夜色的笼罩下&#xff0c;榆阳马合通用机场的跑道上&#xff0c;一架大型固定翼无人机蓄势待发&#xff0c;机身被灯光照亮&#xff0c;宛如一只即将展翅翱翔的钢铁巨鸟。它的货舱里&#xff0c;满满装载着新鲜的榆林羊肉&a…

python-leetcode 38.翻转二叉树

题目&#xff1a; 给定一个二叉树的根节点root,检查它是否轴对称。 方法一&#xff1a;递归 如果一个树的左子树与右子树镜像对称&#xff0c;那么这个树是对称的。 互为镜像的条件&#xff1a;他们的两个根结点具有相同的值&#xff0c;每棵树的右子树都与另一个树的左子树…

锐浪报表 Grid++Report 通用软件,通用模板个性打印

为提高软件打印报表的适应性&#xff0c;再软件中&#xff0c;使用统一的模板&#xff0c;实现个性化的调整。实现不同用的需求&#xff0c;本人作了以下尝试&#xff1a; 一、表头的选择 二、明细表格的高度的调整 // 明细表标题行高GridppReport_7.DetailGrid.ColumnTitle.H…

Plant Simulation培训教程-AGV配送物流仿真模块

原创 知行 天理智能科技 2024年12月31日 07:00 浙江 又到年终盘点的时候了&#xff0c;在这里我把之前录制的Plant Simulation培训教程-AGV配送物流仿真模块分享出来&#xff0c;有需要的可以直接联系我。 模型路径通过Marker点搭建&#xff0c;适用于磁条导航、二维码导航等…

【Python 专题】数据结构 树

LeetCode 题目104. 二叉树的最大深度(gif 图解)方法一:后序遍历(DFS)方法二:层序遍历(BFS)872. 叶子相似的树(DFS 遍历)1448. 统计二叉树中好节点的数目(DFS 遍历)437. 路径总和 III(前缀和 + DFS 回溯)1372. 二叉树中的最长交错路径(DFS)236. 二叉树的最近公共…

基于射频开关选择的VNA校准设计

活动发起人小虚竹 想对你说&#xff1a; 这是一个以写作博客为目的的创作活动&#xff0c;旨在鼓励大学生博主们挖掘自己的创作潜能&#xff0c;展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴&#xff0c;那么&#xff0c;快来参加吧&#xff01…

关于协同显著性物体检测的思考

摘要 问题一&#xff1a;什么叫做CoEG-Net框架&#xff1f; CoEG-Net 是一种用于图像分割或其他计算机视觉任务的深度学习框架&#xff0c;具体来说&#xff0c;它主要关注边缘感知和图像细节恢复。CoEG-Net 的全称是 Contextual Edge Guidance Network&#xff0c;其主要创新…

排查JVM的一些命令

查看JVM相关信息的方法 环境&#xff1a; Win10, jdk17 查看端口的Pid netstat -ano | findstr <端口号>列出当前运行的JVM进程 ## 用于输出JVM中运行的进程状态信息。通过jps&#xff0c;可以快速获取Java进程的PID&#xff08;进程标识符&#xff09;&#xff0c; …

【AI应用】Cherry Studio结合deepseek搭建本地知识库

硅基流动注册 前往 硅基官网 &#xff08;https://cloud.siliconflow.cn/i/JUwuNCzb&#xff09;链接带了我的推荐码&#xff0c;注册成功后&#xff0c;您将获得 14R&#xff08;2000W Token&#xff09;&#xff0c;用于配置 Embedding&#xff08;嵌入式模型&#xff09; 新…

第1章大型互联网公司的基础架构——1.11 消息中间件技术

消息队列&#xff08;Message Queue&#xff09;是分布式系统中最重要的中间件之一&#xff0c;在服务架构设计中被广泛使用。 1.11.1 通信模式与用途 消息中间件构建了这样的通信模式&#xff1a; 一条消息由生产者创建&#xff0c;并被投递到存放消息的队列中&#xff1b;…

windows解压多个文件夹内的zip文件脚本

情景引入 不知道大家是否有一个疑问&#xff0c;如果下载到的源码文件是很多个目录&#xff0c;目录里面的项目都是压缩的&#xff0c;那我们该怎么办&#xff1f; 目录结构 目录结构如下 Test ├── 1 │ └── 1.zip └── 2 └── 2.zip 执行脚本 先cd到Test下&am…

文件和目录的操作-8

文章目录 1.IO流2.文件流操作with语句3.文件和文件夹的操作4.案例1.IO流 通过“流”的形式允许计算机程序使用相同的方式来访问不同的输入/输出源。stream是从源(source)到接收目标的(sink)有序数据。如果把输入/输出源比作“水桶”,那流就是“管道” 文件流:就是源或者…

EasyRTC:轻量化SDK赋能嵌入式设备,开启智能硬件音视频通讯新篇章

在智能硬件与物联网飞速发展的今天&#xff0c;嵌入式设备的音视频通讯能力正变得愈发重要。然而&#xff0c;受限于硬件资源&#xff0c;尤其是Flash存储空间的不足&#xff0c;传统音视频通讯方案往往难以在嵌入式设备上实现高效集成。EasyRTC凭借其轻量级SDK和先进的技术架构…