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.hqwc.cn/news/640455.html

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

相关文章

(八)Pandas窗口数据与数据读写 学习简要笔记 #Python #CDA学习打卡

一. 窗口数据(Window Functions) Pandas提供了窗口函数(Window Functions)用于在数据上执行滑动窗口操作&#xff0c;可以对数据进行滚动计算、滑动统计等操作。需要注意的是&#xff0c;在使用窗口函数时&#xff0c;需要根据实际需求选择合适的窗口大小和窗口函数&#xff0…

3D地图大屏 附源码(Three.js + Vue3)

目录 &#x1f44b; 前言 &#x1f680; 项目包 ⚒️ 字体制作 &#x1f310; 地图制作 &#x1f4a1; 参考视频 & 项目 开源项目&#xff08;Vue3tsWindcssEchartThree.js大屏案例&#xff09; 开源&#xff08;教程&#xff09; UI风格学习&#xff08; www.shuzixs.com …

深兰科技入选2024全国“人工智能+”行动创新案例TOP100

近日&#xff0c;中科院《互联网周刊》联合eNET研究院、德本咨询、中国社会科学院信息化研究中心共同发布了《2024全国“人工智能”行动创新案例TOP100》榜单。经评委会层层遴选&#xff0c;深兰科技专为洛阳市打造的“工业智能化洛阳中心”项目成功入围该榜单。一同入围的还包…

单片机 VS 嵌入式LInux (学习方法)

linux 嵌入式开发岗位需要掌握Linux的主要原因之一是&#xff0c;许多嵌入式系统正在向更复杂、更功能丰富的方向发展&#xff0c;需要更强大的操作系统支持。而Linux作为开源、稳定且灵活的操作系统&#xff0c;已经成为许多嵌入式系统的首选。以下是为什么嵌入式开发岗位通常…

STM32标准库编程与51单片机直接写寄存器的区别和联系

简介&#xff1a; 在学完51单片机之后&#xff0c;我们去学习32的时候&#xff0c;会发现编程的方法有很大的区别&#xff0c;让人非常的不适应&#xff0c;但是通过不断的调用相应外设的库函数之后&#xff0c;你也可以去编程STM32&#xff0c;来实现功能&#xff0c;但是你真…

如何高效协作?

前言 上一篇文章我们分享了《如何高效沟通》&#xff0c;本篇文章继续延伸至更复杂的场景&#xff0c;跨团队/跨部门协作。 什么是协同&#xff1f; 协同也会被称为协作合作&#xff0c;无论是哪种类型的团队&#xff0c;无论哪种方式的工作场景&#xff0c;都一定会有协作发…

智慧公厕解决方案易集成好使用的智能硬件

在现代城市建设中&#xff0c;智慧公厕的需求日益增长。为了提供更好的用户体验和更高效的管理&#xff0c;易集成、好使用的智能硬件成为智慧公厕解决方案的关键组成部分。 1. 蹲位有人无人感应器&#xff1a;是用于检测厕位有人无人的设备&#xff0c;根据现场不同的安装条件…

Rumble Club加速器哪个好用 稳定好用的联机加速器推荐

Rumble Club加速器哪个好用 稳定好用的联机加速器推荐 说到Rumble Club这款游戏&#xff0c;各位休闲玩家肯定不陌生&#xff0c;这是一款基于物理定律的在线玩家对战游戏&#xff0c;玩法独特且充满乐趣。玩家可以使用各种富有想象力的方式推搡、击打和超越对手&#xff0c;以…

我在本地部署通义千问Qwen1.5大模型,并实现简单的对话和RAG

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总…

1957C - How Does the Rook Move?

题目链接&#xff1a;How Does the Rook Move? 如图&#xff1a; 因为每行每列都只能放一个棋子&#xff0c;因此我们用绿点来表示下的棋子&#xff0c;发现一个规律&#xff0c;当红色格子都被绿线划过时&#xff0c;那么就不能下棋子。当这个白色点放在xy这个点&#xff0c…

Linux使用Docker部署DashDot访问本地服务器面板

文章目录 1. 本地环境检查1.1 安装docker1.2 下载Dashdot镜像 2. 部署DashDot应用 本篇文章我们将使用Docker在本地部署DashDot服务器仪表盘&#xff0c;并且结合cpolar内网穿透工具可以实现公网实时监测服务器系统、处理器、内存、存储、网络、显卡等&#xff0c;并且拥有API接…

【解决】echarts条形图纵坐标显示不全

先说结论&#xff1a; option:{...grid: {containLabel: true},... }这个属性是控制整体的坐标标签的。加上这个就可以显示完整了。然后再根据其他属性调整标签的字体、颜色之类的 yAxis : [{...axisLabel:{width:100,overflow:break,truncate:...,color:red,fontSize:10,},..…