Java 中创建线程多种方式介绍

        在 Java 中,创建线程有多种方式,以下是最常见的四种:
        1. **通过继承 `Thread` 类**
        2. **通过实现 `Runnable` 接口**
        3. **通过实现 `Callable` 接口**
        4. **通过使用 `Executor` 框架**


        每种方式都有其特点和适用场景,下面将详细介绍每一种方式,并给出相应的简单例子。
        1. 通过继承 `Thread` 类
        这是创建线程的原始方式,通过继承 `Thread` 类并重写 `run()` 方法来定义线程的执行行为。
        

public class MyThread extends Thread {public void run() {System.out.println("Thread is running");}public static void main(String[] args) {MyThread myThread = new MyThread();myThread.start(); // 启动线程}
}


        
        2. 通过实现 `Runnable` 接口
        实现 `Runnable` 接口是更推荐的方式,因为 Java 只允许单继承,通过实现接口可以避免因为继承 `Thread` 类而导致的类继承层次混乱。
        

public class MyRunnable implements Runnable {public void run() {System.out.println("Runnable is running");}public static void main(String[] args) {Thread thread = new Thread(new MyRunnable());thread.start(); // 启动线程}
}


        
        3. 通过实现 `Callable` 接口
        `Callable` 接口与 `Runnable` 类似,但它允许线程返回结果或抛出异常。这意味着 `Callable` 任务可以用于实现有返回结果的异步计算。
        

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class MyCallable implements Callable<Integer> {public Integer call() {return 1;}public static void main(String[] args) {FutureTask<Integer> futureTask = new FutureTask<>(new MyCallable());Thread thread = new Thread(futureTask);thread.start();try {Integer result = futureTask.get(); // 获取异步计算的结果System.out.println("Result is: " + result);} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}}
}


        
        4. 通过使用 `Executor` 框架
        `Executor` 框架是 Java 并发编程中的一个高级工具,它允许你管理和控制线程池。通过使用 `Executor`,你可以更好地控制线程的生命周期,并且可以复用线程,从而提高性能。
        

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MyExecutor {public static void main(String[] args) {ExecutorService executorService = Executors.newFixedThreadPool(5); // 创建一个包含 5 个线程的线程池executorService.execute(new MyRunnable()); // 提交一个 Runnable 任务executorService.execute(() -> System.out.println("Executor task is running")); // 提交一个 Lambda 表达式任务executorService.shutdown(); // 关闭线程池}
}


        
        总结
        在 Java 中,创建线程有多种方式,每种方式都有其特点和适用场景。通过继承 `Thread` 类是最基础的方式,但可能会导致类层次结构混乱。实现 `Runnable` 接口是更推荐的方式,因为它允许线程重用,避免了单继承的限制。`Callable` 接口允许线程有返回结果或抛出异常,适用于有结果要求的异步计算。`Executor` 框架提供了更高级的线程管理功能,允许你创建和管理线程池,从而提高性能和资源利用率。
        

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

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

相关文章

Go编译报错 link: running gcc failed: exit status 1(已解决)

背景 在对一个开源的Go程序二次开发 重新编译时 &#xff0c; 报错截图如下 报错文字如下&#xff1a;关键信息 link: running gcc failed: exit status 1 $ go build -o orchestrator-didi -i go/cmd/orchestrator/main.go go build: -i flag is deprecated # command-li…

客服提效工具:一键回复,效率翻倍

在快节奏的工作环境中&#xff0c;每一秒都是宝贵的。对于客服人员来说&#xff0c;每天面对的是海量的咨询和回复&#xff0c;如何在保证服务质量的同时&#xff0c;提高工作效率&#xff1f;最近&#xff0c;我被同事安利了一个神奇的工具——客服宝聊天助手。这是一款专为客…

基于单片机的天然气泄漏报警系统设计论文

目 录 摘 要 I Abstract II 1 引 言 1 2天然气泄露检测报警系统的方案设计 4 2.1 方案选择 4 2.2 天然气泄露报警系统的整体设计方案 5 2.2.1天然气泄漏报警器工作原理 5 2.2.2天然气泄漏报警器的结构 5 3天然气泄露报警的硬件部分设计 7 3.1 STC89C52单片机 7 3.2 传感器的选…

IJCAI23 - Continual Learning Tutorial

前言 如果你对这篇文章感兴趣&#xff0c;可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」&#xff0c;查看完整博客分类与对应链接。 本篇 Tutorial 主要介绍了 CL 中的一些基本概念以及一些过往的方法。 Problem Definition Continual Learning 和 Increm…

【MOMO_Tips】批量将word转换为PDF格式

批量将word转换为PDF格式 1.打开文件–>选项–>自定义功能区–>开发工具–>确定 2.点开开发工具&#xff0c;选择第一个visual basic 3.进入页面后找到插入–>模块&#xff0c;就可以看到这样的画面之后将下列vba代码复制粘贴到模块中 Sub ConvertWordsToPd…

进程的内存布局与进程的虚拟地址空间

进程的内存布局 历史沿袭至今&#xff0c;C 语言程序一直都是由以下几部分组成的&#xff1a; ⚫ 正文段。也可称为代码段&#xff0c;这是 CPU 执行的机器语言指令部分&#xff0c;文本段具有只读属性&#xff0c;以防止程序由于意外而修改其指令&#xff1b;正文段是可以共…

精读《React Conf 2019 - Day1》

1 引言 React Conf 2019 在今年 10 月份举办&#xff0c;内容质量还是一如既往的高&#xff0c;如果想进一步学习前端或者 React&#xff0c;这个大会一定不能错过。 希望前端精读成为你学习成长路上的布道者&#xff0c;所以本期精读就介绍 React Conf 2019 - Day1 的相关内…

2024主流测试工具测评,总有一款适合你!

大家好&#xff01;我是测试元宝~ 在软件开发周期中&#xff0c;测试是确保产品质量的关键环节。随着企业对于软件质量的要求日益提升&#xff0c;测试人员面临着前所未有的挑战&#xff0c;“工欲善其事必先利其器”&#xff0c;选择一款高效、实用的软件测试工具&#xff0c…

LeetCode # 547. 省份数量

547. 省份数量 题目 有 n 个城市&#xff0c;其中一些彼此相连&#xff0c;另一些没有相连。如果城市 a 与城市 b 直接相连&#xff0c;且城市 b 与城市 c 直接相连&#xff0c;那么城市 a 与城市 c 间接相连。 省份 是一组直接或间接相连的城市&#xff0c;组内不含其他没有…

Git 基于ED25519、RSA算法生成 SSH 密钥

Git 基于ED25519、RSA算法生成 SSH 密钥 基于ED25519算法&#xff0c;生成密钥对命令如下&#xff1a; ssh-keygen -t ed25519 -C "邮箱地址"基于RSA算法&#xff0c;生成密钥对命令如下&#xff1a; ssh-keygen -t rsa -C "<注释内容>"基于ED255…

若依集成MybatisPlus步骤

目录 一、新建业务模块二、集成MybatisPlus三、测试 一、新建业务模块 新建Maven模块&#xff0c;并建立如下目录 新模块的pom.xml添加如下内容 <description>业务模块</description><dependencies><!-- Mysql驱动包 --><dependency><groupI…

Locust中wait_time中匿名函数使用方法浅析

前言 翻出之前做个压测项&#xff0c;看到locust中对等待时间的实现方式感到好奇&#xff0c;于是总结下来。 源代码实现 def between(min_wait, max_wait):"""Returns a function that will return a random number between min_wait and max_wait.Example:…

thinkphp学习12-数据库的时间查询

传统方式 可以使用>、<、>、<来筛选匹配时间的数据&#xff1b; public function index() {$res Db::name(user)->where(create_time, >, 2018-1-1)->select();dump($res); }可以使用 between 关键字来设置时间的区间&#xff1b; public function in…

如何在Linux系统部署MeterSphere服务并配置固定公网访问地址

文章目录 推荐 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#…

影响APP广告变现收益的4个关键因素

APP的广告收入&#xff08;IAA&#xff09;展示 * eCPM/1000 IAA收入其实是由广告总展示量和每次展示的平均收入共同决定的。所以&#xff0c;提高IAA收入&#xff0c;我们需要双管齐下&#xff1a;同时提高广告总展示量和平均每次展示的收入。 app广告变现对接点击⬇️链接&…

单机版openstack安装

说明&#xff1a; 本文环境&#xff1a;CentOS 7 x64位 1.创建虚拟机 2.在虚拟机中安装 centos 7&#xff08;最小安装&#xff09;&#xff0c;修改主机名&#xff1a;openstack&#xff0c;设置 root 密码&#xff1a;12345678 3. 网卡设置&#xff0c;重启网络服务&#…

20240306-1-大数据的几个面试题目

面试题目 1. 相同URL 题目: 给定a、b两个文件&#xff0c;各存放50亿个url&#xff0c;每个url各占64字节&#xff0c;内存限制是4G&#xff0c;让你找出a、b文件共同的url&#xff1f; 方案1&#xff1a;估计每个文件的大小为50G64320G&#xff0c;远远大于内存限制的4G。所以…

VUE前端问题

一、图表内容不显示 watch: {chartData3: {handler() {this.init();},},timeData3: {handler() {this.init();},},}, 添加上面代码可以动态监控数据&#xff0c;实现图表的展示。 二、背景图片报错显示不出来 解决方法&#xff1a; background: url(~/assets/login/e.png) …

Day23:安全开发-PHP应用后台模块SessionCookieToken身份验证唯一性

目录 具体安全知识点 身份验证-Cookie使用 身份验证-Session使用 唯一性判断-Token使用 总结 源码 思维导图 PHP知识点&#xff1a; 功能&#xff1a;新闻列表&#xff0c;会员中心&#xff0c;资源下载&#xff0c;留言版&#xff0c;后台模块&#xff0c;模版引用&…

Mysql date_format 格式化时间输出

网上的文章都是列一个大而全的表格&#xff0c;还有错误&#xff0c;我完全用不到那么多形式。遂自己开篇文章记录。 把datetime格式化为形如 2024-12-15 18:59:59的形式&#xff1a; %Y-%m-%d %H:%i:%S# 日期格式化输出select date_format(now(),%Y-%m-%d %H:%i:%S) time1,no…