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

news2024/9/24 23:31:46

目录

概述

继承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方法
    * */
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            //循环打印消息,getName方法为当前线程名称
            System.out.println(getName()+"线程运行");
        }
    }
}

实现Runnable接口示例

public class RunnableTest implements Runnable {

    /**
     * 第二种多线程实现方式
     * 此方法是Runnable接口所要求实现的方法,它定义了当线程启动后将要执行的任务逻辑。
     * 在本例中,线程将循环打印100次当前线程的名字和消息"线程运行"。
     */
    @Override
    public 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以传递给调用者
     */
    @Override
    public 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注解标记为一个测试用例。
     */
    @Test
    public 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注解标记为一个测试用例。
     */
    @Test
    public void test02() {
        // 创建一个RunnableTest实例,作为线程共享的任务对象
        RunnableTest runnableTest = new RunnableTest();

        // 使用RunnableTest实例创建线程1
        Thread thread1 = new Thread(runnableTest);

        // 使用RunnableTest实例创建线程2
        Thread 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。
     */
    @Test
    public void test03() throws ExecutionException, InterruptedException {
        // 创建一个CallableTest实例,用于计算从0到99的整数之和
        CallableTest callableTest = new CallableTest();

        // 使用CallableTest实例创建一个FutureTask,以便获取计算结果
        FutureTask<Integer> integerFutureTask = new FutureTask<>(callableTest);

        // 创建一个线程来执行FutureTask
        Thread 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.coloradmin.cn/o/1615929.html

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

相关文章

vue整合Echarts

首先打开网址https://echarts.apache.org/examples/zh/index.html 进入Echars官网找到自己想要的图形我这里选择的是柱形图 点开完整代码直接cv大法 下载Echars的npm npm install echarts 在vue里面挂在个div 导入相关包 写个方法 就是cv过来的 然后改成后端传过来的值…

跨语言大模型最新综述

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

家用洗地机哪款好用?目前口碑最好的家用洗地机

随着科技的不断发展&#xff0c;洗地机已经成为家庭中不可或缺的智能清洁电器。它们能够帮助我们轻松地完成地面清洁工作&#xff0c;节省时间和精力。但是&#xff0c;面对市场上琳琅满目的洗地机品牌&#xff0c;我们该如何选择呢&#xff1f;本文将为您介绍洗地机的挑选指南…

WEB攻防-ASP安全-ASP后门植入连接

windows2003环境搭建&#xff0c;可参考上一篇WEB攻防-ASP安全-MDB下载-CSDN博客 将aspcms解压到C:\inetpub\wwwroot,创建网站并赋予internet来宾用户权限 配置启用父路径和主页指向 上一篇文章提到&#xff0c;数据库文件后缀为asp、asa会被执行解析&#xff0c;所以当进行访…

vue实现光标插入模板和删除指定模板内容

需求&#xff1a; 文本可插入模板文字&#xff1b;同时在“%虚拟机名称%”后一个%删除,会将“%虚拟机名称%”选中删除 以下代码可以直接复制使用&#xff1a; <template><div><div><b>需求&#xff1a;</b> <br> 文本可插入模板文字&am…

AI大模型日报#0422:深扒「全球TOP 10大模型团队」、扎克伯格 Llama 3访谈

导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。 标题: 文本生成8K、360度全景世界&#xff01;Model 3重磅发布 摘要: Blockade Labs发布了新模型Model 3&#xff0c;相比Model 2&#…

【漏洞复现】Linksys RE7000无线扩展器 命令注入漏洞(CVE-2024-25852)

0x01 产品简介 Linksys RE7000无线扩展器是一款功能强大、操作便捷的产品,旨在为用户提供无缝的网络覆盖和更快速、更稳定的网络连接体验。 0x02 漏洞概述 Linksys RE7000无线扩展器存在命令注入漏洞,未授权的攻击者可以通过该漏洞执行任意命令,控制服务器。 0x03 测绘语…

【RSGIS数据资源】1995-2015年亚洲主要国家多种植制度水稻4km单产栅格数据集

文章目录 1. 数据集概况2.数据格式3. 文件命名规则4. 数据生产单位5.元数据6. 引用参考文献 1. 数据集概况 针对大范围高时空分辨率水稻单产数据集缺失的现状&#xff0c;基于亚洲水稻年分布图&#xff0c;提出了一种基于机器学习的精细化格网水稻产量估算方法&#xff0c;利用…

镜像VS快照详细对比

不同之处 依赖性&#xff1a; 快照通常依赖于原始系统的状态或之前的快照。 而镜像是独立的&#xff0c;包含了所需的全部数据。 目的&#xff1a; 镜像用于创建或恢复整个系统&#xff0c;适用于系统迁移、备份或恢复等场景。 快照用于数据恢复&#xff0c;可以快速回滚到之前…

【C++】---STL之vector详解

【C】---STL之vector详解 一、vector的介绍&#xff1a;二、vector的成员函数&#xff1a;1、vector类的构造函数2、vector的元素访问符3、vector的迭代器4、vector的模版5、vector的拷贝构造6、vector的容量&#xff08;1&#xff09;vector的增容机制&#xff08;2&#xff0…

机器人实验室CNRS-AIST JRL, IRL介绍

一、背景 作为搞机器人方向的学生&#xff0c;必须时常关注国际上顶尖实验室的研究成果&#xff0c;以免自己做的方向out&#xff0c;除了大家耳熟能详的Boston Dynamics&#xff0c;还有许多非常厉害的机器人实验室值得我们关注&#xff0c;如日本的CNRS-AIST JRL, IRL实验室…

GenVideo、SkelFormer、EfficientGS、HOLD、Motion Synthesis、Learn2Talk

本文首发于公众号&#xff1a;机器感知 GenVideo、SkelFormer、EfficientGS、HOLD、Motion Synthesis、Learn2Talk Enabling Stateful Behaviors for Diffusion-based Policy Learning While imitation learning provides a simple and effective framework for policy learni…

web前端框架设计第五课-计算属性与监听属性

web前端框架设计第五课-计算属性与监听属性 一.预习笔记 1.计算属性 computed split():拆分 reverse():倒序 join():拼接 计算属性与方法&#xff0c;两者效果一致&#xff0c;但是computed 是基于它的依赖缓存&#xff0c;只有相关依赖发生改变时才会重新取值。而使用 met…

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

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

路由过滤,路由策略小实验

目录 一&#xff0c;实验拓扑&#xff1a; 二&#xff0c;实验要求&#xff1a; 三&#xff0c;实验思路&#xff1a; 四&#xff0c;实验过程&#xff1a; 1&#xff0c;IP配置&#xff1a; 2、R1 和R2 运行 RIPv2&#xff0c;R2&#xff0c;R3 和R4运行 oSPF&#xff0…

卫星导航简介

本文旨在对卫星导航系统进行简要介绍&#xff0c;包括其基本原理、发展历程以及在现代社会中的广泛应用。文章首先阐述了卫星导航的基本原理&#xff0c;即利用卫星发射的信号进行定位和导航。接着&#xff0c;回顾了卫星导航技术的发展历程&#xff0c;从早期的试验阶段到如今…

OneNote插件推荐(OneMore)

使用OneNote编辑笔记时希望有一个插件能够实现markdown的功能&#xff0c;于是发现了OneMark&#xff0c;后面用着用着&#xff0c;OneMark竟然收费了&#xff0c;于是苦苦找寻好用的markdown插件&#xff0c;无果&#xff0c;此时发现我的目标主要是实现对代码的格式化&#x…

vue3中web前端JS动画案例(二)多物体运动-多值运动

<script setup> import { ref, onMounted, watch } from vue // ----------------------- 01 js 动画介绍--------------------- // 1、匀速运动 // 2、缓动运动&#xff08;常见&#xff09; // 3、透明度运动 // 4、多物体运动 // 5、多值动画// 6、自己的动画框架 // …

DBUnit增强:填充随机数据和相对时间数据

痛点 测试环境验证时&#xff0c;遇到与当前相对时间相关的测试吗&#xff1f;准备一份SQL&#xff1f;隔一段时间就不能用了。每过一段时间去更新脚本或重置系统时间&#xff1f;看上去也不是很合适的解决方案。依赖数据测试时要重新做&#xff0c;演示时候得全部改&#xff…

Ubuntu-18.04本地化部署Rustdesk服务器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、配置防火墙二、安装三大件1.下载三大件2.安装三大件 三、安装客户端1.下载客户端1.Windows2.Linux 四、配置客户端连接服务器五、总结 前言 如果你是想数据…