java中多线程的创建方式及常用的方法

目录

概述

继承Thread类:

实现Runnable接口:

实现Callable接口:

示例代码

继承Thread类示例

实现Runnable接口示例

实现Callable接口示例

调用三种线程测试示例

线程常用的成员方法


概述

        常见的创建线程的方式包括:继承Thread类、实现Runnable接口和实现Callable接口。

  • 继承Thread类:

    • 这种方式是通过创建一个类,继承自Thread类,并重写其run()方法来定义线程执行的任务。
    • 优点:简单易用,适合简单的线程任务。
    • 缺点:Java不支持多重继承,因此如果继承Thread类,则无法继承其他类。
  • 实现Runnable接口:

    • 这种方式是创建一个类,实现Runnable接口,并实现其run()方法来定义线程执行的任务。
    • 优点:避免了Java单继承的限制,使得代码更加灵活。
    • 缺点:稍微复杂一些,需要创建Thread对象并将实现了Runnable接口的对象作为参数传递给Thread对象。
  • 实现Callable接口:

    • 实现Callable接口,并实现call()方法。call()方法是在新线程中执行的任务,它可以返回一个结果。
    • 返回结果: Callable接口的call()方法可以返回一个结果,而Runnable接口的run()方法是void类型的,无法返回结果。
    • 抛出异常: call()方法可以抛出异常,而run()方法不能。
    • Future对象: Callable接口执行后可以通过Future对象获取结果,而Runnable接口无法获取执行结果。
    • 泛型支持: Callable接口支持泛型,可以指定call()方法的返回类型。

示例代码

继承Thread类示例

public class ThreadTest extends Thread{/** 第一种多线程实现方式* 继承 Thread 类* 然后重写run方法* */@Overridepublic void run() {for (int i = 0; i < 100; i++) {//循环打印消息,getName方法为当前线程名称System.out.println(getName()+"线程运行");}}
}

实现Runnable接口示例

public class RunnableTest implements Runnable {/*** 第二种多线程实现方式* 此方法是Runnable接口所要求实现的方法,它定义了当线程启动后将要执行的任务逻辑。* 在本例中,线程将循环打印100次当前线程的名字和消息"线程运行"。*/@Overridepublic void run() {// 循环100次for (int i = 0; i < 100; i++) {// 打印当前线程的名字和消息"线程运行"System.out.println(Thread.currentThread().getName() + "线程运行");}}
}

实现Callable接口示例

/*** @author :枫夜* @date : 2024-04-22 16:36* @description : 本类实现了Callable接口,用于定义一个可被线程执行的任务,并返回计算结果。* 本例中,任务计算从0到99的整数之和,并返回结果。**/
public class CallableTest implements Callable<Integer> {/*** 此方法是Callable接口所要求实现的方法,它定义了当线程启动后将要执行的任务逻辑。* 在本例中,线程将计算从0到99的整数之和,并返回结果。* 使用Callable实现创建的线程,可以获取到线程的返回值** @return 计算得到的整数之和* @throws Exception 如果在计算过程中发生异常,可抛出Exception以传递给调用者*/@Overridepublic Integer call() throws Exception {// 初始化累加器int sum = 0;// 循环计算从0到99的整数之和for (int i = 0; i < 100; i++) {sum += i;}// 返回计算结果return sum;}
}

调用三种线程测试示例

public class Test01 {/*** 此方法用于展示创建并启动两个自定义线程对象的过程。* 它使用TestNG的@Test注解标记为一个测试用例。*/@Testpublic void Test01() {// 创建两个ThreadTest实例,分别命名为"线程1"和"线程2"ThreadTest threadTest1 = new ThreadTest();ThreadTest threadTest2 = new ThreadTest();// 设置线程1的名字为"线程1"threadTest1.setName("线程1");// 设置线程2的名字为"线程2"threadTest2.setName("线程2");// 启动线程1,使其进入就绪状态并等待CPU调度执行threadTest1.start();// 启动线程2,使其进入就绪状态并等待CPU调度执行threadTest2.start();}/*** 此方法用于展示使用同一个Runnable实例创建并启动两个线程的过程。* 它使用TestNG的@Test注解标记为一个测试用例。*/@Testpublic void test02() {// 创建一个RunnableTest实例,作为线程共享的任务对象RunnableTest runnableTest = new RunnableTest();// 使用RunnableTest实例创建线程1Thread thread1 = new Thread(runnableTest);// 使用RunnableTest实例创建线程2Thread thread2 = new Thread(runnableTest);// 设置线程1的名字为"线程1"thread1.setName("线程1");// 设置线程2的名字为"线程2"thread2.setName("线程2");// 启动线程1,使其进入就绪状态并等待CPU调度执行thread1.start();// 启动线程2,使其进入就绪状态并等待CPU调度执行thread2.start();}/*** 此方法用于展示使用Callable创建一个线程并获取其计算结果的过程。* 它使用TestNG的@Test注解标记为一个测试用例,并声明抛出可能发生的ExecutionException和InterruptedException。*/@Testpublic void test03() throws ExecutionException, InterruptedException {// 创建一个CallableTest实例,用于计算从0到99的整数之和CallableTest callableTest = new CallableTest();// 使用CallableTest实例创建一个FutureTask,以便获取计算结果FutureTask<Integer> integerFutureTask = new FutureTask<>(callableTest);// 创建一个线程来执行FutureTaskThread thread = new Thread(integerFutureTask);// 启动线程,开始执行Callable任务thread.start();// 调用FutureTask的get方法,阻塞等待直到计算结果可用,并返回结果Integer integer = integerFutureTask.get();// 输出计算结果System.out.println(integer);}
}

线程常用的成员方法

  • String getName()

    • 返回当前线程的名称。
    • 示例:String threadName = Thread.currentThread().getName();
  • void setName(String name)

    • 设置当前线程的名称。
    • 示例:Thread.currentThread().setName("MyThread");
  • static Thread currentThread()

    • 返回当前正在执行的线程对象。
    • 示例:Thread currentThread = Thread.currentThread();
  • static void sleep(long time)

    • 使当前线程休眠指定的时间(以毫秒为单位)。
    • 示例:Thread.sleep(1000);
  • void setPriority(int newPriority)

    • 设置当前线程的优先级,范围为1(最低)到10(最高),默认是5。
    • 示例:Thread.currentThread().setPriority(5);
  • final int getPriority()

    • 返回当前线程的优先级。
    • 示例:int priority = Thread.currentThread().getPriority();
  • final void setDaemon(boolean on)

    • 将当前线程设置为守护线程(Daemon Thread)或用户线程。
    • 守护线程在用户线程结束时自动销毁,销毁不是直接销毁,每次时间不同,但不会时间太长。
    • 示例:Thread.currentThread().setDaemon(true);
  • public static void yield()

    • 暂停当前正在执行的线程对象,并允许其他线程执行。这个方法的作用是让出当前线程的执行权给其他线程,出让之后重新抢夺执行权,谁抢到执行权谁就执行。
    • 示例:Thread.yield();
  • public static void join()

    • 当前线程停止运行,直到被调用的线程执行完毕,然后当前线程再运行。
    • 示例:thread.join();这个示例写在那个线程中,就暂停当前线程,然后运行thread这个线程。

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

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

相关文章

Axure糖尿病健康管理APP原型图,医疗保健血糖监测饮食控制

作品概况 页面数量&#xff1a;共 50 页 源文件格式&#xff1a;rp格式&#xff0c;兼容 Axure RP 9/10&#xff0c;非程序软件无源代码 应用领域&#xff1a;医疗健康、慢病管理、糖尿病管理 作品特色 本作品为Axure糖尿病健康管理APP端原型图&#xff0c;设计规范内容清晰…

浏览器跨标签页通信的方式都有哪些

跨标签页的实际应用场景&#xff1a; 1. 共享登录状态&#xff1a; 用户登录后&#xff0c;多个标签页中需要及时获取到登录状态&#xff0c;以保持一致的用户信息。这种情况&#xff0c;可以使用浏览器的 localStorage 或者 sessionStorage 来存储登录状态&#xff0c;并通过…

difflib 标准库详解:Python 文本对比的利器

&#x1f340; 前言 博客地址&#xff1a; CSDN&#xff1a;https://blog.csdn.net/powerbiubiu &#x1f44b; 简介 difflib 模块是 Python 标准库中的一个模块&#xff0c;用于比较文本之间的差异。它提供了一些函数和类&#xff0c;可以帮助你找到两个字符串或列表之间的…

“傻瓜”学计量——核密度估计KDE

提纲&#xff1a; 什么是核密度估计&#xff0c;是干什么的 代码 1 前言 参数估计vs非参数估计参数估计是样本数据来自一个具有明确概率密度函数的总体。非参数估计是样本数据的概率分布未知&#xff0c;这时&#xff0c;为了对样本数据进行建模&#xff0c;需要估计样本数据…

进阶C语言-文件操作

文件操作 &#x1f388;1.为什么使用文件&#x1f388;2.什么是文件&#x1f52d;2.1程序文件&#x1f52d;2.2数据文件&#x1f52d;2.3文件名 &#x1f388;3.文件的打开和关闭&#x1f52d;3.1文件指针&#x1f52d;3.2文件的打开和关闭 &#x1f388;1.为什么使用文件 ✅ 我…

标准解读|美国纽扣硬币电池新规UL 4200A-2023标准详解

深度解析美国新纽扣电池安全标准UL4200A-关注儿童安全,推动全行业提升 近年来,儿童不慎吞咽纽扣电池并导致严重伤害甚至死亡的事故时有发生,引起社会高度关注。为了降低此类安全隐患,美国权威安全认证机构UL于发布了新的纽扣电池安全标准UL 4200A,对相关电池和产品提出了更严格…

Java精品项目--第8期基于SpringBoot的宠物用品商城的设计分析与实现

项目使用技术栈 SpringBootThymeleafMyBatisMySQLAopJavajdk1.8 项目介绍 项目截图

今日arXiv最热NLP大模型论文:浙江大学:蒸一蒸,多Agent变成单一模型,效果更好

“团结就是力量”&#xff0c;面对复杂多变的现实环境&#xff0c;multi-agent应运而生。相较于单打独斗的single-agent&#xff0c;multi-agent集结了多个功能各异的LLM&#xff0c;共同攻克难关。然而&#xff0c;这种协同作战的方式也带来了沉重的推理负担&#xff0c;限制了…

500道Python毕业设计题目推荐,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

React自定义Hook函数:高效组件开发的秘密武器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

ZISUOJ 数据结构--队列及其应用

说明&#xff1a; 基本都是bfs的常见模板题型&#xff0c;思路都很直接&#xff0c;不过后面有两道题很搞心态&#xff0c;它们给的坐标x、y是反的&#xff0c;导致刚开始一直错。题目还是要看仔细&#xff0c;不能先入为主。 题目列表&#xff1a; 问题 A: 围圈报数(完善程序…

快速部署stable diffusion@Ubuntu

Stable Diffusion可以根据文本描述生成相关的图像&#xff0c;是当前最热门的文生图模型。 在Ubuntu下&#xff0c;可以选择快速安装&#xff0c;或者手动一步步安装。 快速安装 使用文档中的方法&#xff0c;先下载一个sh文件&#xff0c;然后执行这个文件&#xff0c;就自动…

就业班 第三阶段(负载均衡) 2401--4.19 day3 nginx3

二、企业 keepalived 高可用项目实战 1、Keepalived VRRP 介绍 keepalived是什么keepalived是集群管理中保证集群高可用的一个服务软件&#xff0c;用来防止单点故障。 ​ keepalived工作原理keepalived是以VRRP协议为实现基础的&#xff0c;VRRP全称Virtual Router Redundan…

乐鑫科技收购创新硬件公司 M5Stack 控股权

乐鑫科技 (688018.SH) 宣布收购 M5Stack&#xff08;明栈信息科技&#xff09;的控股权。这一战略举措对于物联网和嵌入式系统领域的两家公司来说都是一个重要的里程碑&#xff0c;也契合了乐鑫和 M5Stack 共同推动 AIoT 技术民主化的愿景。 M5Stack 以其创新的硬件开发方式而闻…

SpringCloud系列(9)--将服务消费者Consumer注册进Eureka Server

前言&#xff1a;上一章节我们介绍了如何将服务提供者注册进Eureka服务里&#xff0c;本章节则介绍如何将服务消费者Consumer注册进Eureka服务里 Eureka架构原理图 1、修改consumer-order80子模块的pom.xml文件&#xff0c;引入Eureka Clinet的依赖&#xff0c;然后reolad一下&…

VSCode的C/C++开发 ===> Windows

一、开发环境搭建 安装mingw-w64编译器(GCC for Windows 64 & 32 bits)、Cmake工具(选装) VSCode插件安装 C/C cmake cmake tools 二、代码实践演练 基于g命令 g编译单文件&#xff0c;生成带调试信息的可执行文件、并调试 g -g main.cpp -o my_single_swap g编译多文件…

element plus 布局 代码没反应 样式并未生效

就是这样深深浅浅的颜色不显示&#xff0c;整个页面都是白的。 因为网页上示例代码中没有 添加grid-content ep-bg-purple-dark 等相关颜色的样式 在element plus的github中有相关代码&#xff0c;这里可以找到颜色样式 element-plus/docs/examples/layout/index.scss at de…

C语言(扫雷游戏)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

webgl canvas系列——animation中基本旋转、平移、缩放(模拟冒泡排序过程)

文章目录 ⭐前言⭐canvas绘制图片&#x1f496;状态保存和恢复&#x1f496;移动、旋转、缩放、变形&#x1f496;移动绘制一个渐变的box&#x1f496;旋转&#x1f496;缩放 ⭐模拟冒泡排序过程⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享webgl canvas系…

企业常用Linux正则表达式与三剑客/企业生产环境及知识/企业中远程连接ssh工具(为什么连接有时慢?)

企业高薪思维: 1.学习去抓重点有价值知识 2.猛劲学&#xff0c;使劲学&#xff08;能否给别人将会&#xff0c;讲明白&#xff0c;写明白&#xff0c;练习明白&#xff09;&#xff0c;在学习过程中你觉得学会了60-80%&#xff0c;其实你只会了40-50%&#xff0c;你要讲明白会操…