【Java多线程编程】创建线程的基本方式

news2024/9/28 1:23:50

大家好,我是一只爱打拳的程序猿。今天给大家带来的内容是 Java 创建线程的基本方式。

多线程的基本创建方式:

  • 继承Thread类
  • 实现Runnable接口
  • 匿名内部类
  • 使用lambda表达式

目录

1.  继承Thread类

1.1 Thread类启动线程

2. 实现Runnable接口

2.1 创建Thread类实例

3. 变种创建方式

3.1 匿名内部类

3.2 lambda表达式


1.  继承Thread类

在 Java 中可以继承 Thread类 来进行多线程编程,Thread类 是 Java 提供的一个标准库。继承 Thread 类后我们必需重写 Thread 类中的 run方法 来创建该线程。

如自定义 myThread类 继承 Thread类:

class myThread extends Thread {
    @Override
    public void run() {
        System.out.println("这是一个线程!");
    }
}

通过上述代码,就能创建一个线程。我所创建的线程只是一段简单的话"这是一个线程"


1.1 Thread类启动线程

在 main方法 中创建 myThread类 的实例 thread 引用后,我们可以通过 thread 引用来调用 start()方法 来启动刚刚创建好的线程。

class myThread extends Thread {
    @Override
    public void run() {
        System.out.println("这是一个线程!");
    }
}
public class ThreadDemo {
    public static void main(String[] args) {
        myThread thread = new myThread();
        thread.start();//调用start方法
    }
}

运行后输出:

通过上述代码,我们可以了解到。启动线程的方式的调用 start() 方法 ,因此我们把调用 start() 方法叫为线程的启动,而 run() 方法叫为线程的入口

注意,在 main 也是一个线程,因此在 main 方法中 thread引用 启动的线程作为子线程,main 方法作为主线程。

  • 重写 run() 方法并在 run() 方法覆写相关内容就是创建一个“非启动状态”线程
  • 未调用 start() 方法,线程并未在操作系统底层创建线程

我们也可以通过循环的方式来观察线程运行的过程:

class myThread extends Thread {
    @Override
    public void run() {
        int i = 1;
        while (true) {
            System.out.println("这是myThread内的第"+i+"一个线程!");
            i++;
            if (i == 7){
                break;
            }
        }
    }
}
public class ThreadDemo {
        public static void main(String[] args) {
            myThread thread = new myThread(); //实例化myThread对象
            thread.start();//调用start方法
        }

运行后输出

我们也可以通过 Thread类 里面的一个 静态方法 sleep() 来停顿每个线程,sleep 内的参数为毫秒。你想停顿1秒就设参数为1000,以此类推。

注意,调用该方式时我们必须 Alt+Enter 这个方法,来 try/catch 这个异常。这样程序才能正常的运行, try/catch 后的代码为:

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

不必在意 catch 内的内容,我们只需要关注 sleep 内的参数是多少即可。


总结

  • 继承Thread类,必须重写run方法来创建线程
  • 使用start方法来启动线程
  • 使用Thread类中的静态方法sleep可停顿代码
  • 由于sleep是静态方法,我们必须使用try/catch来处理sleep异常

2. 实现Runnable接口

我们可以通过使用 Runnable接口 来创建一个线程。在使用 Runnable接口 后我们也要重写 run方法 并在run方法里面创建一个线程。

class myThread implements Runnable {
    @Override
    public void run() {
        System.out.println("Hello World");
    }
}

通过上述代码,我们可以观察到 myThread类 使用了 Runnable接口。这样我们就能在 myThread类 中重写 run方法 来创建一个线程。


2.1 创建Thread类实例

与继承 Thread类 来创建线程方法不同的是:如果 Runnable接口 要创建 Thread 类的实例,需要调用 Thread 的构造方法时要将 Runnable 接口类型的对象作为 target 参数。如下所示:

​
class myThread implements Runnable {
    @Override
    public void run() {
        System.out.println("Hello World");
    }
}
public class ThreadDemo {
    public static void main(String[] args) {
        Thread thread = new Thread(new myThread());//调用Thread的构造方法
        thread.start();//调用start方法
    }
}

​

 运行后输出:

通过上述代码以及输出结果,我们发现继承 Thread类 和实现 Runnable接口 除了创建 Thread类实例 不同外,都调用了 start方法 来启动线程。


总结:

  • 实现Runnable接口,必须重写run方法来创建线程
  • 如要通过Runnable接口创建Thread类引用,实例化Thread对象的时候必须将Runnable接口类的对象作为参数来实例化Thread对象
  • Ruannable接口和Thread类启动线程的方式都是通过start方法

3. 变种创建方式


3.1 匿名内部类

匿名内部类创建 Thread类 子类对象:

    public static void main(String[] args) {
        Thread thread = new Thread(){
            @Override
            public void run() {
                System.out.println("这是Thread类里的一个线程");
            }
        };
        thread.start();
    }

运行后输出:

通过上述代码,我们可以观察到。创建了 Thread类 子类对象也是要重写 Thread类 中的 run 方法并在 run 方法里面创建线程的。 


匿名内部类创建 Runnable接口 子类对象:

    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("这是Runnable接口下的一个线程");
            }
        };
        runnable.run();
    }

运行后输出:

创建 Runnable 接口的子类对象,也要重写 Runnable 接口底下的run方法才能创建线程。 


3.2 lambda表达式

lambda 表达式的基本写法为: () -> {}。lambda表达式是通过传参的形式创建子类对象。如使用 lambda 表达式创建一个 Thread 类 线程:

    public static void main(String[] args) {
        Thread thread = new Thread( () -> {
            System.out.println("这是lambda表达式下的一个线程");
        } );
        thread.start();
    }

运行后输出:


 当然我们可以通过循环的方式来观察线程的运行:

    public static void main(String[] args) {
        Thread thread = new Thread( () -> {
            int i = 1;
            while(true) {
                System.out.println("这是第"+i+"个线程");
                i++;
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (i == 7){
                    break;
                }
            }
        });
        thread.start();
    }

运行后输出:

总结:

  • 可通过匿名内部类来创建Thread类的子类对象、Runnable接口的子类对象,并重写run方法来创建一个线程
  • 可通过lambda表达式来创建线程
  • 线程的启动都是用start方法

以上就是创建线程的基本方法,当我们学到多线程进阶内容后。就会学到使用 Callable 接口、线程池、框架来创建线程。这些在我的后期内容会一一给大家展示!

🧑‍💻作者:程序猿爱打拳,Java领域新星创作者,阿里云社区博客专家。

🗃️文章收录于:Java多线程编程

🗂️JavaSE的学习:JavaSE

🗂️Java数据结构的学习: 数据结构与算法


本期博文到这里结束了,感谢点赞、收藏、关注~

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

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

相关文章

while和until的使用方法(还有一些小实验:计算器、猜价格游戏、购物)

while和until的使用方法 一、while用法二、Until循环语句三、猜价格小实验四、计算器实验六、购物实验 一、while用法 for循环语句非常适用于列表对象无规律,且列表来源以固定(如某个列表文件)的场合。而对于要求控制循环次数,操…

C++学习day--06 向计算机输入数据

1、输入 当缓冲区为空时&#xff0c;程序才会暂停&#xff0c;让用户输入数据。 输入回车后&#xff0c;数据全部送到输入缓冲区。 #include <iostream> #include <Windows.h> int main( void ){ char girlType; int salary; float height; std::cout &l…

记录--极致舒适的Vue页面保活方案

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 为了让页面保活更加稳定&#xff0c;你们是怎么做的&#xff1f; 我用一行配置实现了 Vue页面保活是指在用户离开当前页面后&#xff0c;可以在返回时恢复上一次浏览页面的状态。这种技术可以让用户享…

shell脚本4函数

文章目录 shell脚本函数1 函数概述2 定义2.1 形式2.2 使用原则2.3 函数传参2.4 函数变量的作用范围 3 递归3.1 阶乘 4 函数库5 实验5.1 阶乘5.2 递归目录5.3 调用函数库 shell脚本函数 1 函数概述 1、将命令序列按格式写在一起 2、可方便重复使用命令序列 使用函数可以避免代码…

FS4067升压充电8.4V锂电池充电IC电流3A

FS4067升压型5V升压充电8.4V两串锂电池充电IC&#xff0c;工作电压范围于 2.7V 到 6.5V 的 PFM 升压型两节锂电池充电控制集成电路。 FS4067采用恒流和恒压模式对电池进行充电管理&#xff0c;内部集成有基准电压源&#xff0c; 电感电流检测单元&#xff0c;电池电压检测电路和…

【原创】强烈推荐三个可视化模块,绘制的图表真的很酷炫!!

Matplotlib是Python编程语言中最受欢迎的绘图库之一。它提供了一套面向对象的API&#xff0c;可将图表嵌入到使用通用GUI工具包&#xff08;如Tkinter、wxPython、Qt或GTK&#xff09;的应用程序中。Matplotlib还常用于创建静态、动画和交互式的Python数据可视化。它能够绘制各…

【Unity】在Unity下使用websocket的一些经验

首先&#xff0c;先上大家都知道的简介&#xff0c;这一版是我认为比较清晰的。。。虽然在度娘的教导和知乎的教导下&#xff0c;总算认识了websocket&#xff0c;但这个过程比较艰辛&#xff0c;给大家发出来看一下&#xff1a; --------------------------------------------…

精准测试之过程与实践 | 京东云技术团队

作者&#xff1a;京东工业 宛煜昕 一、怎样的技术 •百度百科&#xff1a; 精准测试是一套计算机测试辅助分析系统。 精准测试的核心组件包含的软件测试示波器、用例和代码的双向追溯、智能回归测试用例选取、覆盖率分析、缺陷定位、测试用例聚类分析、测试用例自动生成系统…

苹果(ios)家庭APP广告推送,照片,相册,日历消息推送,【iMessage苹果推】,【苹果家庭推群发】,【imessage相册推送】

解决方案 若是你完全担任苹果的这个默许功效&#xff0c;那就不必要去编削任何代码。 如果&#xff0c;你原本就比较细心&#xff0c;曾经配置了modalPresentationStyle的值&#xff0c;那你也不会有这个影响。 对于想要找回本来默认交互的同学&#xff0c;直接设置以下便可&am…

携手共赢 HashData亮相华为合作伙伴大会

5月8日-9日&#xff0c;以“因聚而生 众志有为”为主题的“华为中国合作伙伴大会2023”在深圳国际会展中心举办。 HashData作为国内云原生数据仓库的代表企业&#xff0c;也是华为重要的生态合作伙伴。在本次大会上&#xff0c;HashData展示了云数仓领域最新前沿技术以及联合…

Java经典笔试题—day04

Java经典笔试题—day04 &#x1f50e;选择题&#x1f50e;编程题&#x1f95d;计算糖果&#x1f95d;进制转换 &#x1f50e;结尾 &#x1f50e;选择题 (1)下列与队列结构有关联的是&#xff08;&#xff09; A. 函数的递归调用 B. 数组元素的引用 C. 多重循环的执行 D. 先到…

Windows系统运行速度优化(系统内存扩充)!

之前有几篇文章&#xff0c;讲述了一些关于提升Windows系统运行速度的方法。链接如下&#xff1a; 如何让Windows系统10秒开机&#xff1f; 电脑运行卡顿怎么办&#xff1f;一招让Windows系统运行流畅 Windows系统重新安装后必须要做的优化 这里还有一个Windows系统的优化方法…

技术领先、“忠”于业务,用友走出多维数据库的价值之路

本文转自科技商业 作者 于洪涛 对于当今的企业而言&#xff0c;精细化管理&#xff0c;已经成为发展之源&#xff0c;甚至是生存之本。 尤其是随着数字化和智能化转型的推进&#xff0c;在企业经营管理过程中&#xff0c;数据正在日益发挥更为关键的要素作用。 相比过去&…

【Linux】Shell脚本之函数的操作+实战详解(建议收藏⭐)

&#x1f341;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; 文章目录 shell脚本函数设置函数的意义函数的基…

物联网|蓝牙4.0BLE协议栈简介|IAR集成开发环境简介|IAR各版本下载链接|物联网之蓝牙4.0 BLE基础-学习笔记(2)

文章目录 129-142暂停&#xff0c;待续3、蓝牙4.0BLE协议栈简介4、IAR集成开发环境简介Tips: BLE协议结构图介绍Tips IAR各版本下载链接 129-142暂停&#xff0c;待续 3、蓝牙4.0BLE协议栈简介 问题: 1、什么是LE协议栈?BLE协识栈与BLE协议的关系&#xff1f; 协议&#xff…

数据结构与算法(Java版) | 队列的应用场景和介绍

队列的一个应用场景 给大家介绍完稀疏数组这种数据结构之后&#xff0c;接下来我再来给大家介绍另外一种数据结构&#xff0c;即队列。 队列&#xff0c;听其名而知其义&#xff0c;相信大家应该都在现实生活中见过&#xff0c;比如在火车站排队买票&#xff0c;或者在麦当劳…

轻NAS搭建 - 使用微力同步搭建私人云盘,无需公网IP也能远程访问

文章目录 1.前言2. 微力同步网站搭建2.1 微力同步下载和安装2.2 微力同步网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 私有云盘作为云存储概念的延伸&#xff0c;虽然谈不上多么新颖&#xff0c;但是其…

图神经网络:在Cora数据集上动手实现图神经网络

文章说明&#xff1a; 1)参考资料&#xff1a;PYG官方文档。超链。 2)博主水平不高&#xff0c;如有错误还望批评指正。 3)我在百度网盘上传了这篇文章的jupyter notebook。超链。提取码8888。 文章目录 代码实操1&#xff1a;GCN的复杂实现代码实操2&#xff1a;GCN的简单实现…

IntelliJ Platform-Plugins-获取方法相关信息(PsiElement/PsiMethodImpl)

PsiElement接口是文件中光标所在的那个字段&#xff0c;或者光标所在的那个方法的抽象&#xff0c;例如下图中PsiElement就是public String getName()&#xff0c;它的实现类是PsiMethodImpl 下面的代码会演示&#xff1a;如果光标在方法上&#xff0c;就打印方法名字&#x…

「Cpolar」内网穿透实现在外远程连接MongoDB数据库【端口映射】

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后端的开发语言A…