【java基础】创建线程的主要方式

在Java中创建线程主要有三种方式:

  1. 继承Thread
    这是最传统的创建线程的方式。你需要创建一个Thread类的子类,并重写run()方法。在run()方法中编写线程要执行的代码。然后,实例化这个子类并调用start()方法来启动线程。

    class MyThread extends Thread {public void run() {// 线程执行的代码System.out.println("Hello from MyThread!");}
    }public class Main {public static void main(String[] args) {MyThread thread = new MyThread();thread.start();}
    }
    
  2. 实现Runnable接口
    另一种创建线程的方式是实现Runnable接口。这种方式的好处是可以避免由于Java的单继承限制带来的问题,因为你可以同时实现多个接口。你创建一个实现了Runnable接口的类,并在run()方法中定义线程的行为。然后,将这个Runnable对象传递给Thread类的构造函数,创建并启动线程。

    class MyRunnable implements Runnable {public void run() {// 线程执行的代码System.out.println("Hello from MyRunnable!");}
    }public class Main {public static void main(String[] args) {Thread thread = new Thread(new MyRunnable());thread.start();}
    }
    
  3. 使用CallableFutureTask
    如果你想从线程中返回一个结果,可以使用Callable接口。Callable接口类似于Runnable,但它的call()方法可以返回一个结果,并且它可以抛出异常。你需要将Callable对象包装到FutureTask中,然后将FutureTask传给Thread对象。

    import java.util.concurrent.Callable;
    import java.util.concurrent.FutureTask;public class Main {public static void main(String[] args) {Callable<Integer> callable = () -> {// 线程执行的代码return 42;};FutureTask<Integer> futureTask = new FutureTask<>(callable);Thread thread = new Thread(futureTask);thread.start();try {int result = futureTask.get(); // 获取结果System.out.println("Result: " + result);} catch (Exception e) {e.printStackTrace();}}
    }
    

此外,现代Java开发中,创建线程的另一种常见方式是使用ExecutorServiceThreadPoolExecutor,它们允许你创建线程池来管理线程的生命周期,这对于处理大量并发任务非常有用。这种方式通常结合RunnableCallable使用。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Main {public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(5); // 创建一个固定大小的线程池for (int i = 0; i < 10; i++) {Runnable worker = new WorkerThread(i);executor.execute(worker); // 提交任务}executor.shutdown(); // 关闭线程池while (!executor.isTerminated()) {}System.out.println("Finished all threads");}
}class WorkerThread implements Runnable {private int id;public WorkerThread(int id) {this.id = id;}@Overridepublic void run() {System.out.println("Hello from thread with ID: " + id);}
}

每种方法都有其适用场景,选择合适的方式取决于你的具体需求,如是否需要返回结果、是否需要避免类的单继承限制等。

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

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

相关文章

【BUG】已解决:Downgrade the protobuf package to 3.20.x or lower.

Downgrade the protobuf package to 3.20.x or lower. 目录 Downgrade the protobuf package to 3.20.x or lower. 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身…

【昇腾AI创新大赛集训营南京站学习笔记】-Ascend算子开发课程

昇腾AI创新大赛训练营 14:00-14:30 基础知识-理论课 一、CANN 、达芬奇架构和算子 1.AI Core逻辑架构 达芬奇架构包含三部分&#xff1a; 1&#xff09;计算类&#xff1a;矩阵计算单元&#xff08;两个矩阵扔进去相乘&#xff09;、向量计算单元、标量计算单元 2&#xff09;控…

逻辑漏洞面试问题

1、你挖过业务逻辑漏洞吗&#xff1f;了解的有哪些&#xff1f;如何进行的&#xff1f;对于业务逻辑漏洞&#xff0c;只有一个登录框&#xff0c;你 会怎么测试&#xff1f;逻辑漏洞 xray 如何避免敏感操作&#xff1f; 常见的业务逻辑漏洞类型包括&#xff1a;订单支付漏洞、…

剑指offer的面试题,赋值运算符函数

class CMyString {public:CMyString(char*pDatanullptr);CMyString(const CMyString&str);~CMyString(void);private:char*m_pData;} 如上为类型Cmystring的声明&#xff0c;请为该类型添加赋值运算符函数。 class CMyString { public:CMyString(char* pData nullptr);CMy…

C#港澳台通行证识别接口、台胞证识别、ocr证件识别

在这个快节奏的时代&#xff0c;效率至上&#xff0c;每一秒都弥足珍贵。想象一下&#xff0c;无需手动输入繁琐的证件信息&#xff0c;仅需轻轻一扫&#xff0c;证面上所有文字信息便可呈现在眼前将是多么的便利&#xff0c;这得益于文字识别技术衍生下的-证件识别接口&#x…

基于单片机控制的变压器油压油温故障检测

摘 要 在电力系统的运行中&#xff0c;通过对其核心设备变压器的故障进行检测&#xff0c;以此能够及时、准确的发现变压器的故障&#xff0c;基于单片机控制的变压器油压油温的故障检测的方法&#xff0c;利用压力传感器、温度传感器对变压器的油压、油温进行采集并送入单片机…

vCenter 错误提示 “目标主机上的vmotion接口未配置”

vCenter 错误提示 “目标主机上的vmotion接口未配置” VMware 使用 vCenter 迁移 虚拟机报错 “目标主机上的 vMotion 接口未配置”&#xff0c;配置启用 vMotion 的步骤如下&#xff1a; &#xff08;END&#xff09;

【CentOS7】解决 CentOS 7 使用 `yum` 时出现的错误

解决 CentOS 7 使用 yum 时出现的错误 问题 在使用 yum 进行各种操作时&#xff08;例如 Plesk 更新、系统更新、软件包安装等&#xff09;&#xff0c;可能会出现以下错误&#xff1a; Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&archx86…

Spring Bean 循环依赖

在Spring框架中&#xff0c;Bean的创建和管理是其核心功能之一。然而&#xff0c;在复杂的应用系统中&#xff0c;Bean之间可能会形成循环依赖&#xff08;Circular Dependency&#xff09;&#xff0c;这种情况如果不加以妥善处理&#xff0c;将会导致Spring容器在初始化时抛出…

leetcode3098. 求出所有子序列的能量和

官解 class Solution(object):# 定义常量mod int(1e9 7) # 模数&#xff0c;用于防止结果溢出inf float(inf) # 无穷大&#xff0c;用于初始化时的特殊值def sumOfPowers(self, nums, k):n len(nums) # 数组长度res 0 # 用于存储最终结果# 三维动态规划表&#xff0c;…

Nacos-2.4.0最新版本docker镜像,本人亲自制作,部署十分方便,兼容postgresql最新版本17和16,奉献给大家了

基于Postgresql数据库存储的nacos最新版本2.4.0,采用docker镜像安装方式 因业务需要,为了让nacos支持postgresql,特意花了两天时间修改了源码,然后制作了docker镜像,如果你也在找支持postgresql的nacos最新版本,恭喜你,你来的正好~ nacos-2.4.0 postgresql的数据库脚本…

C#中的new以及类

new关键字的用法 实例化对象&#xff1a;使用 new 关键字可以创建一个类的实例。例如&#xff1a; ​ MyClass obj new MyClass(); 指定构造函数&#xff1a;如果类有多个构造函数&#xff0c;可以使用 new 关键字指定使用哪一个构造函数来创建对象。例如&#xff1a; ​ MyC…

Apache SeaTunnel快速入门及原理和实践(一)

一、概述 主要从以下6个方面进行&#xff1a; 对数据集成做一个简单的概括对 SeaTunnel 做简单的介绍介绍 SeaTunnel 当前的原理和架构演进对当前市面上一些比较常见的数据集成工具进行对比&#xff0c;来解读一下现在市面上已经有了那么多数据集成工具&#xff0c;为什么我们…

Django Web框架——01

目录 文章目录 目录 Django框架的介绍起源&现状Django的安装 创建Django项目创建项目的指令Django项目的目录结构settings.py 文件介绍 URL 介绍URL定义Django如何处理一个URL对应的请求视图函数(view) Django 路由配置path() 函数path转换器 re_path()函数 HTTP协议的请求…

CoAP——Libcoap安装和使用(Ubuntu22.04)

1、简介 CoAP&#xff08;Constrained Application Protocol&#xff09;是一种专为受限设备和网络设计的应用层协议。它类似于HTTP&#xff0c;但具有更轻量级的特性&#xff0c;适合用于物联网&#xff08;IoT&#xff09;环境中的低功耗和低带宽设备。Libcoap是一个轻量级的…

云计算实训12——配置web服务器、配置客户端服务器、配置DNS服务、实现DNS域名解析

一、配置web服务器 准备操作 首先在正式配置之前需要做以下操作 关闭防火墙 systemctl stop firewalld 永久关闭防火墙 systemctl disable firewalld 关闭selinux setenforce 0 永久关闭selinux vim /etc/selinux/config selinuxpermissive 还需要保证能够正常ping通www.bai…

什么是 JSON文件

JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;它独立于语言&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成。JSON基于JavaScript的对象字面量语法&#xff0c;但是它作为一种数据格式&#xff0c;并不仅…

【SpingCloud】客户端与服务端负载均衡机制,微服务负载均衡NacosLoadBalancer, 拓展:OSI七层网络模型

客户端与服务端负载均衡机制 可能有第一次听说集群和负载均衡&#xff0c;所以呢&#xff0c;我们先来做一个介绍&#xff0c;然后再聊服务端与客户端的负载均衡区别。 集群与负载均衡 负载均衡是基于集群的&#xff0c;如果没有集群&#xff0c;则没有负载均衡这一个说法。 …

有哪些好用的 AI 学术研究工具和科研工具?

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/ AI 应用其实分两个层面&#xff0c;第一是模型&#xff0c;第二是应用。现在很多模型厂家都是既做 toC 的对话应用&#xff0c;也做 t…

GD 32 流水灯

前言&#xff1a; 通过后面的学习掌握了一些逻辑架构的知识&#xff0c;通过复习的方式将学到的裸机任务架构的知识运用起来&#xff0c;同时巩固前面学到的知识&#xff0c;GPIO的配置等。 开发板上LED引脚使用示意图 注&#xff1a;此次LED灯的点亮凡是是高电平点亮&#xff…