【Java】多线程:Thread类并行宇宙

news2024/9/20 10:55:53

欢迎浏览高耳机的博客

希望我们彼此都有更好的收获

感谢三连支持!

在现代编程中,多线程是提高程序性能和响应能力的一种重要手段。Java 通过 Thread 类和 Runnable 接口提供了丰富的线程管理功能。本文是对 Thread 类基本用法的总结。

线程创建

线程可以通过继承 Thread 类或实现 Runnable 接口来创建。下面举例了五种常见的线程创建方式,其中继承 Thread 类的方式更直接,但一个类只能继承一个父类,因此推荐使用实现 Runnable 接口或者使用lambda表达式的方式。

 //1.继承Thread类,重写run方法:
    public static class MyThread extends Thread {
        @Override
        public void run() {
            System.out.println("线程运行中...");
        }
    }

    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
    }


 //2.实现Runnable接口,重写run方法:
    public static class MyRunnable implements Runnable {
        @Override
        public void run() {
            System.out.println("线程运行中...");
        }
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new MyRunnable());
        thread.start();
    }


 //3.继承Thread类,重写run方法,使用匿名内部类:
    public static void main(String[] args) {
        Thread thread = new Thread() {
            @Override
            public void run() {
                System.out.println("线程运行中...");
            }
        };
        thread.start();
    }


 //4.实现Runnable接口,重写run方法,使用匿名内部类:
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程运行中...");
            }
        });
        thread.start();
    }


   //5.使用Lambda表达式:
    public static void main(String[] args) {
        Thread thread = new Thread(() -> System.out.println("线程运行中..."));
        thread.start();
    }

值得注意的是,在Thread类中,run();和start();存在一定的区别和联系:

方法的区别:

1.run方法被直接调用时,会和其他普通方法一样在当前线程中直接执行;

2.start方法是Thread类一个特殊的方法,当调用start方法时,它会调用run方法并创建一个新的线程来执行;

运行结果的区别:

1.run方法是直接在当前线程中执行的,意味着它不会并行,而是按照顺序执行;

2.调用start方法,JVM会分配一个新的线程,并在这个新线程中调用run方法;使其可以和主线程进行并行;

线程中断

线程中断是一种协作机制,它提供了一种让线程通知其他线程结束运行的方式。可以通过调用线程的 interrupt(); 方法来中断线程。

interrupt()方法:当调用一个线程的interrupt()方法时,会将该线程的中断标志设置为true

isInterrupted()方法:此方法用于检查线程的中断标志是否为trueThread.currentThread().isInterrupted()用于检查当前线程的中断标志,而t.isInterrupted()用于检查指定线程的中断标志。

InterruptedException:当线程在阻塞状态(如调用Thread.sleep()Object.wait()等)时,如果该线程被中断,会抛出InterruptedException异常,并且清除中断标志(即将其设置为false)。

class MyThread extends Thread {
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            // 线程的工作
        }
        System.out.println("线程被中断");
    }
}

public class Main {
    public static void main(String[] args) throws InterruptedException {
        MyThread t = new MyThread();
        t.start();
        Thread.sleep(1000); // 等待一段时间
        t.interrupt(); // 中断线程
    }
}

线程等待

线程等待通常是指让当前线程暂停执行,直到其他线程完成某些操作。通过 join(); 方法实现。

class MyThread extends Thread {
    public void run() {
        // 线程的工作
    }
}

public class Main {
    public static void main(String[] args) throws InterruptedException {
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
        t1.start();
        t1.join(); // 等待t1线程完成
        t2.start();
    }
}

试试看如果注释掉t1.join();会发生什么? 答案是t1与t2线程会同时执行工作,而从微观角度来看,它们的运行时间会有细微的差异,因此每次的运行输出结果可能会有所不同;

正是因为有了join等待机制,使得t2必须等待t1线程完成工作才得以运行,从而保证了输出结果的稳定性;

线程休眠

线程休眠是指让当前线程暂停执行一段时间,可以通过 Thread.sleep() 方法实现。

class MyThread extends Thread {
    public void run() {
        // 线程的工作
        System.out.println("Thread " + Thread.currentThread().getName() + " is running.");
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
        t1.start(); 

        try {
            // 主线程睡眠1000毫秒
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        t2.start(); 
    }
}

在这个代码中,t1线程会立即启动,而t2线程会在主线程睡眠1000毫秒后启动。这样,t2线程的启动时间会比t1晚1000毫秒。这是在不修改MyThread类的情况下,通过控制主线程的执行流程来实现t2的延迟启动. 和使用join线程等待来实现输出顺序的稳定性有一定的相似之处.

获取线程实例

每个线程都是 Thread 类的实例。在创建线程时,无论是通过继承 Thread 类还是实现 Runnable 接口,都会创建一个 Thread 对象。

Thread t1 = new Thread(new MyRunnable());

在这个例子中,t1 就是线程的实例。


希望这篇博客能为你理解多线程并行提供一些帮助。

如有不足之处请多多指出。

我是高耳机。

 

 

 

 

 

 

 

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

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

相关文章

Ubuntu 22.04上安装Java JDK 8

在Ubuntu 22.04上安装Java JDK 8可以通过以下步骤完成: 前言 本文特别感谢浪浪云的赞助发布。浪浪云,其卓越的云服务和技术支持,一直致力于为用户提供高效、可靠的解决方案。无论是个人开发者、小型企业还是大型组织,浪浪云都能…

11.01类的定义和对象的使用(练习)

类的定义 类名:手机(Phone) 成员变量:品牌(brand),价格(price) 成员方法:打电话(calL),发短信(sendMessage) 调用类变量和方法

商标申请注册加字加成通用词等于没加!

以前普推知产商标曾分析过“东方甄选”火遍全网后,许多人申请注册商标都喜欢加“甄选”,但是“甄选”基本属于通用词了,加“甄选”后还是属于前面那个词。 近期看到有人加“心选”,甄选,优选,心选等还都是选…

HTTPTomcat

HTTP&Tomcat&Servlet 今日目标: 了解JavaWeb开发的技术栈理解HTTP协议和HTTP请求与响应数据的格式掌握Tomcat的使用掌握在IDEA中使用Tomcat插件 1,Web概述 1.1 Web和JavaWeb的概念 Web是全球广域网,也称为万维网(www),…

day01 - Java基础语法

第一章 Java概述 1995年美国Sun推出Java,2009年Sun公司被甲骨文收购 Java之父:詹姆斯高斯林(James Gosling) Java编译器将源程序编译成与平台无关的字节码文件(class文件),然后由JVM对字节码文件解释执行。不同操作系统&#xf…

【C++】多态,要这样学

🚀个人主页:奋斗的小羊 🚀所属专栏:C 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 前言💥1、多态的定义和实现💥1.1 什么是多态💥1.2 多态的定义和实现&…

杨氏矩阵中查找想要找到的数

文章目录 一、题目二、思路三、代码实现 提示:以下是本篇文章正文内容,下面案例可供参考 一、题目 二、思路 第一步 根据杨氏矩阵的规则说明矩阵从左到右递增,从上往下递增,因此我们可以画出这样的图。 对于杨氏矩阵&#xff0…

java面向对象:构造方法

给出javabean类代码 package google.test5;public class Student {private String name;private int age;public Student(){System.out.println("看看我打印了嘛?");}public Student(String name, int age){this.name name;this.age age;}public void …

Vue路由二(嵌套多级路由、路由query传参、路由命名、路由params传参、props配置、<router-link>的replace属性)

目录 1. 嵌套(多级)路由2. 路由query传参3. 路由命名4. 路由params传参5. props配置6. <router-link>的replace属性 1. 嵌套(多级)路由 pages/Car.vue <template><ul><li>car1</li><li>car2</li><li>car3</li></ul…

进程启动和进程终止

文章目录 进程程序进程进程ID进程表项C程序的启动过程启动例程进程终止atexit函数示例--终止函数的执行流程以及多种进程终止方式的对比 进程启动和退出流程图查看系统中的进程 进程 程序 程序是存放在磁盘文件中的可执行文件。当代码进行编辑保存后使用gcc等编译工具进行编译…

【机器学习】OpenCV入门与基础知识

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 OpenCV入门与基础知识简介安装与环境配置WindowsLinuxmacOS 核心数据结构MatSca…

Linux:进程状态和优先级

一、进程状态 1.1 操作系统学科&#xff08;运行、阻塞、挂起&#xff09; 为了弄明白正在运行的进程是什么意思&#xff0c;我们需要知道进程的不同状态 大多数操作系统都遵循以下原则 1.1.1 运行状态 因为有一个调度器需要确保CPU的资源被合理使用&#xff0c;所以需要维护…

【C++】学完c语言后的c++基础知识补充!(命名空间、输入和输出、缺省函数、函数重载、引用、内联函数代替宏、nullptr代替NULL)

一. 命名空间 1. 定义 出现的意义&#xff1a;解决各种函数、关键词和类的名称冲突问题。 定义方式&#xff1a;namespace 命名空间的名字 { } &#xff08;注意&#xff01;}后面不加&#xff1b;&#xff09; namespace 是关键词命名空间的…

CenterNet官方代码—目标检测模型推理部分解析与项目启动

CenterNet模型推理部分解析 CenterNet官方代码环境部署 CenterNet作为2019年CVPR推出的论文&#xff0c;论文中给出了官方代码所在的github仓库地址。https://github.com/xingyizhou/CenterNet。 整个代码的代码量并不是特别大&#xff0c;但整个项目的难点在于使用了老版本的…

横向移动-WMI

什么是WMI? WMI是基于 Web 的企业管理 (WBEM) 的 Windows 实现&#xff0c;WBEM 是跨设备访问管理信息的企业标准。 WBEM&#xff08;Web-Based Enterprise Management&#xff09;是一个开放标准&#xff0c;用于跨平台和跨设备的管理信息访问。WMI&#xff08;Windows Mana…

VMware Fusion虚拟机Mac版 安装Win10系统教程

Mac分享吧 文章目录 Win10安装完成&#xff0c;软件打开效果一、VMware安装Windows10虚拟机1️⃣&#xff1a;准备镜像2️⃣&#xff1a;创建虚拟机3️⃣&#xff1a;虚拟机设置4️⃣&#xff1a;安装虚拟机&#xff08;步骤和Win11安装步骤类似&#xff0c;此处相同步骤处没换…

C++从入门到起飞之——继承下篇(万字详解) 全方位剖析!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 1、派⽣类的默认成员函数 1.1 四个常⻅默认成员函数 1.2 实现⼀个不能被继承的类 ​编辑 2. 继承与友…

词嵌入(二):基于上下文窗口的静态词嵌入(从NNLM、CW模型谈到基于层次Softmax、负采样的Word2Vec模型)

文章目录 一、经典神经语言模型&#xff08;A Neural Probabilistic Language Model&#xff09;二、C&W模型 (Collobert and Weston, 2008)2.1 文章背景2.2 模型架构&#xff08;词向量的表示&#xff09;2.2.1 Lookup-Table Layer&#xff08;查找表&#xff09;2.2.2 TD…

STM32关于keil使用过程中遇到的问题

1.设备管理器STlink驱动确认安装完成&#xff0c;但是keil里一直识别不到&#xff0c;换下载器也没用 &#xff08;1&#xff09;问题描述 我的问题是这样产生的&#xff1a;之前用标准库开发STM32的时候&#xff0c;STLink能够正常使用&#xff0c;然后使用HAL库开发的时候出…

仓储管理系统的设计与实现SSM框架

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…