创建线程有几种方式?

在Java中共,共有四种方式可以创建线程,分别是

  • 继承Thread类创建线程。

  • 实现Runnable接口创建线程。

  • 通过Callable和FutureTask创建线程。

  • 通过线程池创建线程。

扩展

Runnable和Callable的区别

Runnable接口和Callable接口都可以用来创建线程,实现Runnable的时候,需要实现run方法;实现Callable接口的话,需要实现call方法。

Runnable的run方法无返回值,Callable的call方法有返回值,类型为Object。

Callable中可以抛出checked exception,而Runnable不可以。

Callable和Runnable都可以应用于executors。而Thread类只支持Runnable。

Future

Future是一个接口,代表了一个异步执行的结果。接口中的方法用来检查执行是否完成、等待完成和得到执行的结果。当执行完成后,只能通过get()方法得到结果,get方法会阻塞直到结果准备好了。如果想取消,那么调用cancel()方法。

FutureTask是Future接口的一个实现,它实现了一个可以提交给Executor执行的任务,并且可以用来检查任务的执行状态和获取任务的执行结果。

RutureTask和Callable示例

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * FutureTask和Callable示例
 * 2024/3/19
 */
public class FutureAndCallableExample {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Callable<String> callable=()->{
            System.out.println("Entered Callable");
            Thread.sleep(2000);
            return "Hello from Callable";
        };

        /*Callable<String> callable=new Callable<String>() {
            @Override
            public String call() throws Exception {
                System.out.println("Entered Callable");
                Thread.sleep(2000);
                return "Hello from Callable";
            }
        };*/

        FutureTask<String> futureTask = new FutureTask<>(callable);
        Thread thread = new Thread(futureTask);
        thread.start();

        System.out.println("Do something else while callable is getting executed");
        System.out.println("Retrieved: "+futureTask.get());
    }
}

线程池和Callable的示例

import java.util.concurrent.*;

/**
 * 线程池和Callable的示例
 * 2024/3/19
 */
public class ExecutorsAndCallableExample {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService executor= Executors.newSingleThreadExecutor();
        Callable<String> callable = () ->{
            System.out.println("Entered Callable");
            Thread.sleep(2000);
            return "Hello from Callable";
        };

        System.out.println("Submitting Callable");
        Future<String> future = executor.submit(callable);
        System.out.println("Do something else while callable is getting executed");
        System.out.println("Retrieved: "+future.get());

        executor.shutdown();
    }
}

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

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

相关文章

3GPP 协议资料学习和文档下载

一、登录3GPP官网 3GPP – The Mobile Broadband Standard 二、选择Specifications Per TSG Round 三、选择ftp下载路径 四、选择不同阶段的3GPP协议 包含了从1999年到R18,甚至更新到当前最新的协议。 五、查看对应版本的LTE或者5G NR协议 其中LTE射频相关章节为36.521系列&…

进销存记账软件有哪些?中小商户的进销存记账管理软件选购指南

进销存记账软件已经成为众多实体店不可或缺的管理工具。利用这类软件&#xff0c;实体店能够解决手工记账效率低下、对账繁琐且容易出错等问题。 然而&#xff0c;许多实体店都是小本经营&#xff0c;对于进销存记账软件的选择缺乏经验&#xff0c;导致随意选购的结果往往令人…

C++开发基础理解std::string 对象的生命周期,避免悬空指针或内存访问错误

一、字符串的两种类型互换 在C开发中&#xff0c;const char * 和 std::string 是用于表示字符串的两种不同类型。它们之间可以相互转换。但是需要注意const char * 和 std::string 的互换场景错误。 const char * 到 std::string 的转换&#xff1a; 可以使用 std::string 的…

保研线性代数机器学习基础复习1

1.什么是代数&#xff08;algebra&#xff09;? 为了形式化一个概念&#xff0c;构建出有关这个概念的符号以及操作符号的公式。 2.什么是线性代数&#xff08;linear algebra&#xff09;&#xff1f; 一项关于向量以及操作向量的公式的研究。 3.举一些向量的例子&#x…

使用 Clip 反推提示词报<error>解决方案

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 本文主要介绍在使用 Stable Diffusion WebUI 中使用图生图中的“使用 Clip 反推提示词”时报了<error>异常的解决…

JSes6语法和Json快速入门

对象操作 对象的crud 创建对象&#xff1a;let obj{} 新增属性&#xff1a;ojb.a1 修改属性&#xff1a;ojb.a2 查询属性&#xff1a;obj.a 删除属性&#xff1a;delete obj.a 其他操作 obj[a]1 Object.assign() //深拷贝&#xff1f;浅拷贝 let{ name} user &#x…

巨控GRM110系列:短距离内的无线通讯模块

标签: #巨控GRM110 #无线通讯 #ROLA技术 #工业自动化 #远程数据采集 在工业自动化和智能制造的领域中&#xff0c;数据的准确传输是实现高效生产的关键。随着技术的不断进步&#xff0c;无线通讯技术已成为破解远距离数据传输难题的利器。今天&#xff0c;我们将聚焦于一款革命…

JAVA的sort用法详解(二维数组排序,List<>排序,lambada表达式,自定义类型排序)

目录 前言&#xff1a; 一维数组降序&#xff1a; 方法1.Comparator接口&#xff1a; 代码实现&#xff1a; 方法2.Collections.reverseOrder()&#xff1a; 代码实现&#xff1a; 二维数组排序&#xff1a; 代码如下&#xff1a; List<>排序&#xff1a; 代码…

遥感卫星影像质量评价指标汇总

1. 主观评价方法 以人为图像的评价者&#xff0c;根据自己的评价尺度和经验对图像质量进行评价。 2. 客观评价方法 1)均方差 2)信噪比 主要用来评价影像经压缩、传输、增强等处理前后的质量变化情况&#xff0c;其本质与均方差类似。 3)方差 反映了图像各个像元灰度相对…

基于js css的瀑布流demo

要实现照片按照瀑布流展示&#xff0c;写个小demo&#xff0c;记录下。 瀑布流实现思路如下&#xff1a; CSS 弹性布局对 3 列按横向排列&#xff0c;对每一列内部按纵向排列 html代码&#xff1a; <div class"content"></div> css代码&#xff1a; …

【学习】企业申请DCMM原来有这么多的好处

DCMM&#xff0c;即数据管理能力成熟度评估模型&#xff08;Data management Capability Maturity Model&#xff09;&#xff0c;是我国在数据管理领域首个正式发布的国家标准。DCMM的核心目的是帮助企业利用先进的数据管理理念和方法&#xff0c;建立和评价自身的数据管理能力…

基于springboot实现蜗牛兼职网平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现蜗牛兼职网平台系统演示 摘要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;蜗牛兼职网当然也不能排除在外。蜗牛兼职网是以实际运用为开发背景&#xff…

基于单片机超声波停车位自动检测系统设计

**单片机设计介绍&#xff0c;基于单片机超声波停车位自动检测系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机超声波停车位自动检测系统设计概要主要涵盖了利用超声波传感器和单片机技术实现停车位自动检测与…

三翼鸟:创牌仅3年,2023场景交易额超51亿

文 | 智能相对论 作者 | 沈浪 3月27日晚间&#xff0c;海尔智家发布了2023年报。财报显示&#xff0c;2023年海尔智家实现营收2614.28亿元&#xff0c;同比增长7.33%&#xff1b;经营利润169.21亿元&#xff0c;同比增长15.8%&#xff1b;归母净利润165.97亿元&#xff0c;同…

科学高效备考2024年汉字小达人:历年真题详细解析-古诗文专题10

距离2024年第11届汉字小达人比赛还有七个多月的时间&#xff0c;如何利用这段时间有条不紊地备考呢&#xff1f;我的建议是两手准备&#xff1a;①把小学1-5年级的语文课本上的知识点熟悉&#xff0c;重点是字、词、成语、古诗。阅读理解不需要。②把历年真题刷刷熟&#xff0c…

c++的学习之路:5、类和对象(1)

一、面向对象和面向过程 在说这个定义时&#xff0c;我就拿c语言举例&#xff0c;在c语言写程序的时候&#xff0c;基本上就是缺什么函数&#xff0c;就去手搓一个函数&#xff0c;写的程序也只是调用函数的&#xff0c;而c就是基于面向对象的开发&#xff0c;他关注的不再是单…

<QT基础(3)>QLineEdit使用笔记

LineEdit 这次要用的是两个功能&#xff1a;初始化展示参数值&#xff0c;修改参数值。 初始化 将l_num的默认值显示 ui.lineEdit->setText(QString::number(l_num));信号 textChanged() 文本发生改变textEdited() 文本编辑信号cursorPositionChanged(&#xff09;光标发…

【字节二面】SpringBoot可以同时处理多少请求

目录 一、示例代码二、那么springboot可以处理多少请求&#xff1f;三、maxConnections、maxThreads、acceptCount的关系 一、示例代码 RestController Slf4j public class RequestController {GetMapping("/test")public String test(HttpServletRequest request) …

jsonpath和json数据(序列化eval()、反序列化loads())及断言处理(断言封装)

jsonpath&#xff1a;对json串进行搜索 安装jsonpath 安装&#xff1a;pip install jsonpath 导入&#xff1a; from jsonpath import jsonpath jsonpath能通过简单的方式就能提取给定JSON中的字段。 jsonpath官方地址&#xff1a;https://goessner.net/articles/JsonPath/ 在…

Python-VBA编程500例-022(入门级)

最长AB子串(Longest AB Alternating Substring)(或称为最长XY出现次数相同的子字符串)这个问题看似是一个比较抽象的编程问题&#xff0c;但在实际应用场景中&#xff0c;它可以用来解决一系列涉及平衡性和重复模式的实际问题。常见应用场景有&#xff1a; 1、DNA或RNA序列分析…