掘金 后端 ( ) • 2024-04-15 09:33

theme: Chinese-red highlight: a11y-dark

咦咦咦,各位小可爱,我是你们的好伙伴 bug菌,今天又来给大家手把手教学Java SE系列知识点啦,赶紧出来哇,别躲起来啊,听我讲干货记得点点赞,赞多了我就更有动力讲得更欢哦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~


🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

前言

在日常开发过程中,Java作为一种广泛应用于企业级应用开发的编程语言,它具有良好的跨平台性和丰富的类库,因此在多线程编程中也有着重要的地位。本文将介绍Java多线程的基本概念及其在应用程序开发中的应用。

摘要

我们都了解一个概念,多线程是什么?它是指在一个程序中同时执行多个线程,每个线程可以独立地执行不同的任务。多线程的使用可以提高应用程序的响应性和资源利用率,特别是在多核处理器上。本文将详细介绍Java多线程的概念、原理和使用方法,并通过实例展示其在实际应用中的应用场景。

概述

多线程是项目开发中会经常使用到的一个知识点,就是因为它允许在同一时间内执行多个任务。在传统的单线程程序中,每个任务按顺序执行,只有当前任务执行完成后才能执行下一个任务,并且任务之间无法并行执行。而多线程程序允许同时执行多个任务,任务之间可以并行执行,从而提高了应用程序的执行效率。

在Java中,线程是程序执行的最小单位,每个线程都有自己的栈、程序计数器和本地变量表。Java提供了多线程编程的支持,可以通过创建Thread对象或实现Runnable接口来创建线程,并使用start()方法启动线程的执行,虽然创建线程的方式远不止这几种,但是目前为了基础的同学,我们这里就以最基础的创建方式来学习,后续再深入。

示例演示

这里,我先以一个简单的Java多线程示例来引门,希望同学们能够看清楚,每行的代码具体在做一件什么事,这也有助于同学们学习它。

package com.example.javase.bugTest.threadProject.day1;

/**
 * @Author bug菌
 * @Source 公众号:猿圈奇妙屋
 * @Date 2024-04-14 22:52
 */
public class MyThreadTest extends Thread {
    public void run() {
        System.out.println("Thread running");
    }

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

在上述代码中,我们创建了一个继承自Thread类的MyThreadTest类,并重写了run()方法。在main()方法中,我们创建了一个MyThreadTest对象并调用start()方法启动线程的执行。

本地测试结果如下:

在这里插入图片描述 代码解析:

根据如上代码,我们可以知道:该案例定义了一个继承自Thread类的MyThreadTest类,在该类中重写了run()方法。run()方法中打印了一条消息"Thread running"。在main()方法中,创建了一个MyThreadTest对象,并通过调用start()方法启动线程。当线程启动后,会自动调用run()方法,输出"Thread running"。是不是与实际运行结果是一致的呢?

应用场景案例

多线程在实际应用中有很多应用场景,以下是一些常见的应用场景案例:

  1. 并行计算:多线程可以将一个大任务分解成多个小任务并行执行,从而加快任务的执行速度。

  2. 异步处理:多线程可以用于处理异步任务,例如网络请求、文件读写等,提高应用程序的响应速度。

  3. 服务器编程:多线程可以用于处理多个客户端的请求,提高服务器的并发处理能力。

  4. 图形界面编程:多线程可以用于处理图形界面的显示和用户事件响应,提高界面的流畅性和响应性。

优缺点分析

使用多线程编程具有以下优点:

  • 提高应用程序的响应性:多线程可以使应用程序能够同时处理多个任务,提高用户体验和系统的响应速度。

  • 提高资源利用率:多线程可以充分利用多核处理器的计算能力,提高系统的资源利用率。

  • 分解复杂任务:多线程可以将一个复杂的任务分解成多个小任务并行执行,提高任务的执行效率。

然而,多线程编程也存在一些缺点:

  • 线程安全问题:多线程在访问共享数据时需要进行同步操作,否则可能会导致数据不一致的问题。

  • 资源竞争问题:多线程在访问共享资源时可能会产生竞争条件,需要进行合适的同步操作来解决竞争问题。

  • 上下文切换开销:多线程在切换上下文时需要保存和恢复线程的状态,这会带来一定的开销。

类代码方法介绍

在Java多线程编程中,常用的类和方法有:

  • Thread类:代表一个线程,可以通过继承Thread类或实现Runnable接口来创建线程。

  • start()方法:用于启动线程的执行。

  • run()方法:线程的主体方法,需要重写此方法以定义线程的执行逻辑。

  • sleep()方法:使当前线程休眠指定的时间,让其他线程有机会执行。

  • join()方法:等待指定线程执行完毕,再继续执行当前线程。

  • synchronized关键字:用于保证多线程的同步执行,防止产生竞争条件和线程安全问题。

测试用例

下面是一个简单的测试用例,用于演示多线程的使用:

测试代码

package com.example.javase.bugTest.threadProject.day1;

/**
 * @Author bug菌
 * @Source 公众号:猿圈奇妙屋
 * @Date 2024-04-14 22:55
 */
public class MultiThreadDemo {
    public static void main(String[] args) {
        Thread t1 = new Thread(new MyThread());
        Thread t2 = new Thread(new MyThread());

        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("All threads have finished");
    }

    static class MyThread implements Runnable {
        public void run() {
            for (int i = 0; i < 10; i++) {
                System.out.println(Thread.currentThread().getName() + ": " + i);
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

在上述测试用例中,我们创建了两个线程并分别启动它们的执行。每个线程会打印从0到9的数字,并在每打印一个数字后休眠100毫秒。最后,主线程等待两个子线程执行完毕后打印输出"All threads have finished"。

测试结果

针对如上测试代码,这里我本地进行实际测试一波,结果仅供参考,有条件的同学们也可以自己本地实践一下。

在这里插入图片描述

测试代码解析

针对如上测试代码,这里我再具体给大家讲解下,希望能够更透彻的帮助大家理解。

上述案例是一个简单的多线程示例。我主要是通过创建两个线程t1和t2,并启动它们,然后使用join()方法等待两个线程执行完成后再打印All threads have finished

每个线程都是由MyThread类实现了Runnable接口来创建的。在run()方法中,使用for循环输出当前线程的名称和循环变量i的值,并通过Thread.sleep(100)方法使线程睡眠100毫秒。这样可以模拟出线程之间的并行执行。

main()方法中,首先创建并启动两个线程t1和t2。然后使用join()方法等待两个线程执行完成。通过try-catch块捕获可能出现的InterruptedException异常。最后,在所有线程都执行完成后打印All threads have finished

我写这段代码的目的也是为了帮助同学们能够理解多线程的基本用法和控制线程执行顺序的方法。

小结

在这里,我先进行一次小结,本文介绍了Java多线程的概念、原理和使用方法。多线程是程序设计中的一个核心概念,它允许在同一时间内执行多个任务,提高应用程序的响应性和资源利用率。通过创建Thread对象或实现Runnable接口,我们可以创建和启动线程,并通过加锁等方式保证多线程的安全执行。

总结

如果同学们看到这里,通过本文的学习,我们可以了解了Java多线程的基本概念、原理和使用方法。多线程编程在实际应用中有着重要的作用,可以提高应用程序的响应性和资源利用率。然而,多线程编程也需要注意线程安全问题和资源竞争问题,合理地使用锁机制可以避免这些问题。

结尾

虽然这只是一篇最基础的入门,但是大家也不会觉得就仅仅是如此简单,对于多线程,它是Java编程中的重要内容,掌握多线程的概念和使用方法对于提高应用程序的性能和用户体验非常有帮助。通过深入学习和实践,我们可以更好地理解和运用多线程编程,为应用程序开发带来更高的效率和质量。

... ...

好啦,这期的内容就基本接近尾声啦,若你想学习更多,你可以看看专栏的导读篇《「滚雪球学Java」教程导航帖》,本专栏致力打造最硬核 Java 零基础系列学习内容,🚀打造全网精品硬核专栏,带你直线超车;欢迎大家订阅持续学习。功不唐捐,久久为功!

「赠人玫瑰,手留余香」,咱们下期拜拜~~

附录源码

如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

☀️建议/推荐你

无论你是计算机专业的学生,还是对编程感兴趣的跨专业小白,都建议直接入手「滚雪球学Java」专栏;该专栏不仅免费,bug菌还郑重承诺,只要你学习此专栏,均能入门并理解Java SE,以全网最快速掌握Java语言,每章节源码均同步「Gitee」,你真值得拥有;学习就像滚雪球一样,越滚越大,带你指数级提升。

码字不易,如果这篇文章对你有所帮助,帮忙给bugj菌来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。

📣关于我

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 20w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!