Java多线程:初识多线程!左手画方,右手画圆

这篇具有很好参考价值的文章主要介绍了Java多线程:初识多线程!左手画方,右手画圆。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java多线程:初识多线程!左手画方,右手画圆,趣学Java,java,开发语言,多线程

  • 👑专栏内容:Java
  • ⛪个人主页:子夜的星的主页
  • 💕座右铭:前路未远,步履不停


嗨!想象一下,你的面前有一张展开的白纸,而你的左手和右手各握一支画笔。你的任务是在同一时间,左手画出一个方形,右手画出一个圆形。你觉得这能够完成吗?我相信大多数人会认为这是不可能完成的任务。因为我们的大脑是单线程的,一次只能专注于一项任务,一心二用在绝大多数情况下是不可行的。然而,计算机不同,它具备多线程编程的能力,可以同时处理多个任务。现在,让我们一起探索Java中多线程这个神奇的功能吧。
Java多线程:初识多线程!左手画方,右手画圆,趣学Java,java,开发语言,多线程

一、线程与进程

进程是计算机中执行中的程序的实例。它是操作系统进行管理和调度的基本单位

线程,有时被称为轻量级进程,是程序中的一个单独的执行流。它是操作系统调度的最小单位。与进程相比,线程之间的上下文切换通常更为迅速和高效。一个线程就是一个 “执行流”。每个线程之间都可以按照顺讯执行自己的代码、多个线程之间 “同时” 执行着多份代码。

  • 进程是操作系统能独立调度的最小单位,而线程是进程中可并发执行的单元;
  • 一个应用程序至少包括1个进程,而1个进程包括1个或多个线程;
  • 每个进程在执行过程中拥有独立的内存单元,而一个进程的多个线程在执行过程中共享内存。

Java多线程:初识多线程!左手画方,右手画圆,趣学Java,java,开发语言,多线程

那我们来简单的类比一下吧!

Java多线程:初识多线程!左手画方,右手画圆,趣学Java,java,开发语言,多线程
计算机的CPU就像一个工厂,而进程就是工厂里面的车间线程就是车间里面的工人

我们能够发现,多核CPU对应多个工厂,这些工厂可以从事不同的生产任务。比如有炼铁的、炼油的、食品加工等等。在一个工厂中,又可以包含一个或多个车间(进程),但是由于电力资源有限,同一时间就只能有一个车间在运行。换句话说,对于单核CPU,同一时间只能处理一个进程,其他进程处在等待状态。而一个车间中,可以有一个或多个工人(线程)协同工作,他们共享内部资源,共同完成任务。

同一个进程中,这些线程共用同一份资源(内存 + 硬盘…),但是每个线程独立去CPU上调度(状态、上下文、优先级、记账信息…)各自有各自的一份

所以,进程是操作系统进行分配的基本单位。而线程是操作系统进行调度执行的基本单位。
Java多线程:初识多线程!左手画方,右手画圆,趣学Java,java,开发语言,多线程
【面试题】谈谈进程和线程的区别和联系

  • 进程是包含线程的,都是实现并发编程的方式,但是线程比进程更轻量。

  • 进程是系统分配资源的基本单位,线程是系统调度的基本单位。创建进程的时候,把分配资源(虚拟地址空间、文件描述符表)的工作给做了,后面创建线程,直接共用资源即可。

  • 进程有独立的地址空间,彼此之间不会相互影响到,进程的独立性。多个线程共用这份地址空间,一个线程一旦抛出异常,就可能会导致进程异常结束。

  • 进程和进程之间不共享内存空间,同一个进程的线程之间共享同一个内存空间。

Java多线程:初识多线程!左手画方,右手画圆,趣学Java,java,开发语言,多线程
Java多线程:初识多线程!左手画方,右手画圆,趣学Java,java,开发语言,多线程

二、创建线程方法

在 Java 中,有两种创建多线程的方式,分别是继承 Thread 类和实现 Runnable 接口。下面让我们一起来学习下这两种创建多线程的方法吧。

1、继承Thread类

class Mythread extends Thread{
    public void run() {
        System.out.println("这是线程运行代码!");
    }
}

public class Main {
    public static void main(String[] args) {
    
        Mythread mythread = new Mythread();
        mythread.start();
    }
}

创建一个类,继承 Thread ,重写run方法,该方法包含线程的实际执行逻辑。

start()方法:start() 方法是Thread类的一个方法,它用于启动线程并调用线程的run()方法。
在这个例子中,myThread.start() 会启动一个新的线程,并在新线程中执行 run() 方法中定义的代码。

如果把myThread.start();改成myThread.run();后,运行的结果也是hello world。这两个有什么不一样呢?

run只是上面的入口方法,并没有调用系统api也没有创建真正的线程来。

Java多线程:初识多线程!左手画方,右手画圆,趣学Java,java,开发语言,多线程

2、实现Runnable接口

class Myrunnable implements Runnable{
    public void run() {
        System.out.println("这是线程运行代码!");
    }
}

public class Main {
    public static void main(String[] args) {

        Thread thread = new Thread(new Myrunnable());
        thread.start();
    }
}

该方法主要是创建一个类,实现 Runnable 接口,重写run方法。

3、两者区别

Thread这里是直接把要完成的工作,放到了ThreadRun方法中

Runnable这里,则是分开了,把要完成的工作放到了Runnable中,再让RunnableThread配合。

把线程要执行的任务和线程本身进一步解耦合了。并发编程中,来完成某个工作,使用Runnable描述这个工作的具体细节。这样使用多线程的方式,就可以使用Runnable来搭配线程使用。使用线程池的方式,就可以使用Runnable来搭配线程池使用,使用协议的方式,也可以使用Runnable搭配协程。

特征 继承 Thread 实现 Runnable 接口
类的继承关系 直接继承 Thread 类。 类实现 Runnable 接口,可以继承其他类。
创建方式 创建类的子类,重写 run() 方法。 创建类,实现 Runnable 接口,实现 run() 方法。
多线程对象创建 直接创建线程对象的实例。 先创建 Runnable 对象,再通过 Runnable 对象创建 Thread 对象。
启动线程 直接调用 start() 方法。 调用 Thread 类的构造方法,传递 Runnable 对象,然后调用 start() 方法。
资源共享 较难实现资源共享。 更容易实现资源共享,因为可以共享同一个 Runnable 对象。
多态使用 难以使用多态,因为已经继承了 Thread 类。 更容易使用多态,因为类可以继续实现其他接口或继承其他类。

4、举个栗子

回到上面的问题。把myThread.start();改成myThread.run();后,运行的结果也是hello world。
这两个有什么不一样呢?我们来举个栗子看看吧。

Java多线程:初识多线程!左手画方,右手画圆,趣学Java,java,开发语言,多线程

class MyThread extends Thread{
    @Override
    public void run() {
        while(true){
            System.out.println("hello thread");
        }
    }
}
public class Demo1 {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
        //myThread.run();
        while(true){
            System.out.println("hello main");
        }
    }
}

Java多线程:初识多线程!左手画方,右手画圆,趣学Java,java,开发语言,多线程
使用myThread.start();运行的程序,会同时打印hello thread 和 hello main

两个循环都在执行,两个线程分别执行自己的循环,并发性的执行。

而使用myThread.run();运行的程序,只会打印hello main

只执行了一个循环。

Java多线程:初识多线程!左手画方,右手画圆,趣学Java,java,开发语言,多线程

5、简洁写法

我们可以通过匿名内部类来ThreadRunnable这两种写法。
什么是匿名内部类?

匿名内部类是一种在声明和创建类的对象同时进行的特殊形式,它没有显式的类名称。这种方式通常用于在使用类的地方定义类的实例,尤其是在创建接口的实现或继承抽象类的实例时。

Ⅰ、Thread匿名内部类写法

    public static void main(String[] args) {
        Thread thread = new Thread(){
            @Override
            public void run() {
                System.out.println("这是线程运行代码!");
            }
        };
        thread.start();
    }

Java多线程:初识多线程!左手画方,右手画圆,趣学Java,java,开发语言,多线程

Java多线程:初识多线程!左手画方,右手画圆,趣学Java,java,开发语言,多线程

Ⅱ、Runnable匿名内部类写法

    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
            System.out.println("这是线程运行代码!");
            }
        });
        thread.start();
    }

Java多线程:初识多线程!左手画方,右手画圆,趣学Java,java,开发语言,多线程

Java多线程:初识多线程!左手画方,右手画圆,趣学Java,java,开发语言,多线程

Ⅲ、使用Lambda表达式

Lambda表达式主要用于实现函数式接口,Lambda表达式本质上就是一个匿名函数,像这样的匿名函数可以做回调函数来使用。

Java多线程:初识多线程!左手画方,右手画圆,趣学Java,java,开发语言,多线程

匿名函数,就是没有命名的函数。它具有传递函数体的能力,却无需提前声明整个函数的结构。

回调函数则是在程序执行中,不需要程序员主动调用的函数。相反,它会在特定的时机或条件下,由系统或其他代码自动触发执行。程序员通过将函数传递给其他代码,实现了一种回调机制,使得在适当的时候,这个函数会被调用,完成特定的操作。

好了,废话不多说,先用Lambda表达式写一下吧。

    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            System.out.println("这是线程运行代码!");
        });
        thread.start();
    }

Thread thread = new Thread(() -> {
这里使用Lambda表达式创建了一个新的Thread对象,构造方法接受一个Runnable接口的实现作为参数。Lambda表达式的内容在大括号中,用于定义线程运行时执行的代码块。

Java多线程:初识多线程!左手画方,右手画圆,趣学Java,java,开发语言,多线程

线程的创建并不是只有这五种写法,还可以用线程池和Callable写法。这个我们后面再聊!文章来源地址https://www.toymoban.com/news/detail-786574.html

到了这里,关于Java多线程:初识多线程!左手画方,右手画圆的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【从零开始学习JAVA | 第三十七篇】初识多线程

    目录 前言: ​编辑 引入: 多线程:         什么是多线程:         多线程的意义:         多线程的应用场景: 总结:                 本章节我们将开始学习多线程,多线程是一个很重要的知识点,他在我们实际开发中应用广泛并且基础,可以说掌握多线程编写程

    2024年02月14日
    浏览(107)
  • Java进阶(ConcurrentHashMap)——面试时ConcurrentHashMap常见问题解读 & 结合源码分析 & 多线程CAS比较并交换 初识

    List、Set、HashMap作为Java中常用的集合,需要深入认识其原理和特性。 本篇博客介绍常见的关于Java中线程安全的ConcurrentHashMap集合的面试问题,结合源码分析题目背后的知识点。 关于List的博客文章如下: Java进阶(List)——面试时List常见问题解读 结合源码分析 关于的Set的博

    2024年02月06日
    浏览(61)
  • Linux多线程【初识线程】

    ✨个人主页: 北 海 🎉所属专栏: Linux学习之旅 🎃操作环境: CentOS 7.6 阿里云远程服务器 将一份代码成功编译后,可以得到一个可执行程序,程序运行后,相关代码和数据被 load 到内存中,并且操作系统会生成对应数据结构(比如 PCB )对其进行管理及分配资源,准备工作

    2024年02月12日
    浏览(47)
  • 【多线程】初识线程,基础了解

    目录 认识线程     概念         什么是线程?         为啥要有线程         进程和线程的区别         Java 的线程 和 操作系统线程 的关系     创建线程         1.继承 Thread 类         2.实现 Runnable 接口         3.通过匿名内部类方式创建Thread与实现

    2024年02月03日
    浏览(35)
  • 多线程的初识和创建

    ✨个人主页:bit me👇 ✨当前专栏:Java EE初阶👇 ✨每日一语:知不足而奋进,望远山而前行。 根据我们前面学的进程,为什么要有多个进程呢?为了并发编程,他的 CPU 单个核心已经发挥到极致了, 想要提升算力,就得使用多个核心。 引入并发编程,最大的目的就是为了能

    2024年01月21日
    浏览(31)
  • 【多线程】网络原理初识

    1.2 独立模式 独立模式:计算机之间相互独立 这个时候的计算机还不能够联网,当时的家用计算机可以用来打单机游戏或者是视频播放等功能。 1.3 网络互联 随着时代的发展,越来越需要计算机之间互相通信,共享软件和数据,即以多个计算机协同工作来完成业务,就有了网

    2024年02月13日
    浏览(29)
  • QT 初识多线程

    QThread是Qt线程中有一个公共的抽象类,所有的线程类都是从QThread抽象类中派生的,需要实现QThread中的虚函数run(),通过start()函数来调用run函数。      void run() 函数是线程体函数,用于定义线程的功能。      void start() 函数是启动函数,用于将线程入口地址设置为ru

    2024年02月09日
    浏览(31)
  • 初识linux之线程基本概念

    目录 一、进程地址空间和页表再理解 二、线程 1.线程的概念 2. 进程与线程 3. 线程的意义 4.线程的优点缺点 4.1 优点 4.2 缺点  4.linux中线程的优缺点 4.1 优点 4.2 缺点 5. linux中线程创建相关接口 5.1 线程创建 6. 通过代码查看进程与线程的关系 6.1 线程库 6.2 信号与线程 6.3 主线程

    2023年04月12日
    浏览(44)
  • matlab画圆(及其他常用图形)

    1.matlab画圆 (1)代码: 注意: 这行代码一定要加,这样可以让matlab的横纵轴同一刻度等长,要不然会不等长就看起来像椭圆一样。 (2)代码: 2.画矩形 3.输出图片 print函数可以将图片输出,第二个参数为格式,第三个参数为文件名(文件名可以带路径)。  

    2024年02月12日
    浏览(51)
  • 坐标系基础相关知识:右手定则

    如果坐标系的原点在右手掌,拇指向上延伸的方向对应于某个坐标轴的方向,则可以利用常规的右手定则确定其他坐标轴的方向。例如,在下图中,假设拇指指向Z轴的正方向,食指伸直的方向对应于X轴的正方向,中指向外延伸的方向则为Y轴的正方向。 当拇指伸直并且与给定

    2024年02月16日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包