【多线程】| 基本知识汇总

这篇具有很好参考价值的文章主要介绍了【多线程】| 基本知识汇总。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🦁 掌握基本概念

1. 什么是线程?

线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。
【多线程】| 基本知识汇总

在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(Thread)

2. 什么是主线程以及子线程?

【多线程】| 基本知识汇总
当Java程序启动时,一个线程会立刻运行,该线程通常叫做程序的主线程(main thread),即main方法对应的线程,它是程序开始时就执行的。
在主线程中创建并启动的线程,一般称之为子线程。

3. 什么是串行?什么是并行? 什么是并发?

  1. 串行(serial):一个CPU上,按顺序完成多个任务(先完成一个再接着下一个,类似栈里面的过程)

【多线程】| 基本知识汇总

  1. 并行(parallelism):指的是任务数小于等于cpu核数,即任务真的是一起执行的

【多线程】| 基本知识汇总

  1. 并发(concurrency):一个CPU采用时间片管理方式交替的处理多个任务。一般是是任务数多于cpu核数,通过操作系统的各种任务调度算法,实现用多个任务“一起”执行(实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去一起执行而已)
    【多线程】| 基本知识汇总

🦁 线程的创建

一般两种方法:一个是继承Thread类(单继承)、一个是实现Runnerable接口(多实现)。

1. 通过继承Thread类实现多线程

  • 在Java中负责实现线程功能的类是java.lang.Thread 类。
  • 可以通过创建 Thread的实例来创建新的线程。
  • 每个线程都是通过某个特定的Thread对象所对应的方法run( )来完成其操作的方法run( )称为线程体
  • 通过调用Thread类的start()方法来启动一个线程。
public class TestThread extends Thread { //自定义类继承Thread类
  //run()方法里是线程体
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(this.getName() + ":" + i);	//getName()方法是返回线程名称
        }
    }

    public static void main(String[] args) {
        TestThread thread1 = new TestThread();//创建线程对象
        thread1.start();//启动线程
        TestThread thread2 = new TestThread();
        thread2.start();
    }
}

2. 通过Runnable接口实现多线程

public class TestThread2 implements Runnable { //自定义类实现Runnable接口;
  //run()方法里是线程体;
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }
    public static void main(String[] args) {
    //创建线程对象,把实现了Runnable接口的对象作为参数传入;
        Thread thread1 = new Thread(new TestThread2());
        thread1.start();//启动线程;
        Thread thread2 = new Thread(new TestThread2());
        thread2.start();
    }
}

🦁 线程执行流程

一个线程的一生需要经历五个状态:

开始——>就绪——>运行——>阻塞——>死亡

【多线程】| 基本知识汇总

详细变化如下👇


【多线程】| 基本知识汇总

  1. 新生态:在线程被new出来之后,拥有自己的内存空间则变成新生态。
  2. 就绪状态:等待被cpu执行的状态,进入这种状态的情况有三种:
  • 要么是新的线程被调用 start()方法

  • 要么就是运行状态执行了yield()方法放弃了执行权回到就绪状态重新排队

  • 要么就是线程阻塞解除,进入就绪状态。

  1. 运行状态:线程终于可以执行自己run()方法里面的代码,直到运行结束或者其它因素才会终止运行。
  2. 阻塞状态:线程因为某些因素终止执行,进入阻塞状态。(只有从运行状态才能进入阻塞状态)
  3. 死亡状态:线程执行完毕或者被调用了destroy()等方法(赐死)。

🦁 常用的方法

1. 线程休眠

sleep()方法:可以让正在运行的线程进入阻塞状态,直到休眠时间满了,进入就绪状态。sleep方法的参数为休眠的毫秒数。

Thread.sleep(5000);			//休眠5s

2. 线程让步

yield()方法:让当前正在运行的线程回到就绪状态,以允许具有相同优先级的其他线程获得运行的机会。因此,使用yield()的目的是让具有相同优先级的线程之间能够适当的轮换执行。

tips:

  • yield是一个静态的方法。
  • 调用yield后,yield告诉当前线程把运行机会交给具有相同优先级的线程。
  • yield不能保证,当前线程迅速从运行状态切换到就绪状态。
  • yield只能是将当前线程从运行状态转换到就绪状态,而不能是等待或者阻塞状态。
Thread.yield();

3. 线程联合

使得线程由并行变串行

join()方法:当前线程邀请调用方法的线程优先执行,在调用方法的线程执行结束之前,当前线程不能再次执行。线程A在运行期间,可以调用线程B的join()方法,让线程B和线程A联合。这样,线程A就必须等待线程B执行完毕后,才能继续执行。
eg:
场景:实现爸爸让儿子买烟。

/**
 * 儿子买烟线程
 */
class SonThread implements Runnable{


  @Override
  public void run() {
    System.out.println("儿子出门买烟");
    System.out.println("儿子买烟需要10分钟");
    for(int i=0;i<10;i++){
      System.out.println("第"+i+"分钟");
      try {
        Thread.sleep(1000);
       } catch (InterruptedException e) {
        e.printStackTrace();
       }
     }
    System.out.println("儿子买烟回来了");
   }
}


/**
 * 爸爸抽烟线程
 */
class FatherThread implements Runnable{


  @Override
  public void run() {
    System.out.println("爸爸想抽烟,发现烟抽完了");
    System.out.println("爸爸让儿子去买一包红塔山");
    Thread t = new Thread(new SonThread());
    t.start();
    System.out.println("等待儿子买烟回来");
    try {
      t.join();
     } catch (InterruptedException e) {
      e.printStackTrace();
      System.out.println("爸爸出门找儿子");
      System.exit(1);
     }
    System.out.println("爸爸高兴的接过烟,并把零钱给了儿子");
   }
}


public class TestJoinDemo {
  public static void main(String[] args) {
    System.out.println("爸爸和儿子买烟的故事");
    Thread t = new Thread(new FatherThread());
    t.start();
   }
}

4. 获取线程名称

  1. 如果是使用继承Thread类的方式,则可以直接调用this.getName()获取线程名称。
class GetName1 extends Thread{
  @Override
  public void run() {
    System.out.println(this.getName());
   }
}
  1. 如果是实现Runnable接口实现多线程方式,则可以调用Thread.currentThread().getName()获取线程名称。
class GetName2 implements Runnable{
  @Override
  public void run() {
    System.out.println(Thread.currentThread().getName());
   }
}

5. 修改线程名称

  1. 通过构造方法设置线程名称
class SetName1 extends Thread{
  public SetName1(String name){
    super(name);
   }
  @Override
  public void run() {
    System.out.println(this.getName());
   }
}


public class SetNameThread {
  public static void main(String[] args) {
    SetName1 setName1 = new SetName1("SetName1");
    setName1.start();
   }
}

  1. 通过setName()方法设置线程名称。
class SetName2 implements Runnable{


  @Override
  public void run() {
    System.out.println(Thread.currentThread().getName());
   }
}
public class SetNameThread {
  public static void main(String[] args) {
    Thread thread = new Thread(new SetName2());
    thread.setName("SetName2");
    thread.start();
   }
}

6. 判断线程是否存活

isAlive()方法: 判断当前的线程是否处于活动状态

活动状态是指线程已经启动且尚未终止,线程处于正在运行或准备开始运行的状态,就认为线程是存活的

class Alive implements Runnable{


  @Override
  public void run() {
    for(int i=0;i<4;i++){
      System.out.println(Thread.currentThread().getName()+" "+i);
      try {
        Thread.sleep(500);
       } catch (InterruptedException e) {
        e.printStackTrace();
       }
     }
   }
}


public class TestAliveThread {
  public static void main(String[] args) {
    Thread thread = new Thread(new Alive());
    thread.setName("Alive");
    thread.start();
    System.out.println(thread.getName()+" "+thread.isAlive());
    try {
      Thread.sleep(4000);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
    System.out.println(thread.getName()+" "+thread.isAlive());
   }
}

🦁 最后

这期的分享到这里,下期见!文章来源地址https://www.toymoban.com/news/detail-460452.html

到了这里,关于【多线程】| 基本知识汇总的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • c++ 基本知识(一)

    一、c++调用python #include cstdlib int main() {     int result = system(\\\"python your_script.py\\\");     return 0; } 二、cmake、make、gcc的区别? 1、CMake(Cross-Platform Make)是一个跨平台的构建工具,用于生成适合不同操作系统和编译器的构建脚本。它使用CMakeLists.txt文件来描述项目的构建过程,并根据

    2024年02月16日
    浏览(9)
  • camera 硬件基本知识

    camera 硬件基本知识

    参考博客:1.【Camera专题】Qcom-你应该掌握的Camera调试技巧2_c枫_撸码的日子的博客-CSDN博客_outputpixelclock 2.浩瀚之水_csdn的博客_CSDN博客-深度学习,嵌入式Linux相关知识汇总,Caffe框架领域博主 3.一个早起的程序员的博客_CSDN博客-FPGA,PCIe应用实战,PCI-E理论剖析领域博主 一、硬件相关

    2024年02月15日
    浏览(13)
  • python基本知识学习

    python基本知识学习

    在控制台输出Hello,World! 单行注释:以#开头 多行注释: 选中要注释的代码Ctrl+/ 三单引号 三双引号 第一个字符必须是字母表中字母或下划线 _ 。 标识符的其他的部分由字母、数字和下划线组成。 标识符对大小写敏感。 标识符也叫变量名,变量名就是一个变量的名字,例如

    2024年02月15日
    浏览(10)
  • Qt 基本知识

    QMainWindow:主窗口 菜单栏 工具栏 状态栏 QWidget:空白的窗口 所有界面组件的基类 QDialog:对话框类 new project Qt Widget Application qmake 后缀为 .pro 基类:QWidget Generate form 不要去掉 自动生成 ui 文件 Kit 一般使用第一个 widget.ui 界面加个 label 就行 可以在右下角进行调整 GUI 程序结构

    2024年02月22日
    浏览(12)
  • CSS基本知识

    CSS基本知识

    CSS叫做层叠样式表。CSS 能够对网页中元素位置的排版进行像素级精确控制, 实现美化页面的效果。能够做到页面的样式和结构分离。 举个例子: 这里的style标签我们一般设置在head标签里。 可以看出被选择器修饰的和没被修饰的不同。 写在 style 标签中,嵌入到 html 内部,理

    2024年01月24日
    浏览(28)
  • 前端基本知识介绍

    前端基本知识介绍

    目录 一.前端三剑客 1.前导 2.三剑客的分工 二.VsCode的介绍与配置 1.vscode的介绍 2.vscode的下载安装 3.vscode的使用 3.1 图形界面操作 3.3 常用插件 三.HTML基础标签 HTML基础知识 1.HTML为何物? 2.标签介绍 3.HTML属性 4.HTML标签骨架 基本的HTML标签 1.HTML标题标签 2.换行与空格 3.HTML段落

    2024年02月03日
    浏览(29)
  • shell基本知识

    shell基本知识

    一、为什么学习和使用shell编程 二、什么是shell 系统当前支持的所有的shell: 三、shell的分类 为nologin,运行进程的,不允许登录系统,考虑系统安全性 用户名:密码的占位符:uid(用户的id):gid(用户所属基本组的id:关于账号的描述信息:用户家目录:当前用户与系统交

    2024年02月12日
    浏览(15)
  • 数学向量基本知识

    数学向量基本知识

    1.向量相关定义 2.向量的线性运算 3.向量积与数量积    向量积与数量积的区别 名称 标积/内积/数量积/点积 矢积/外积/向量积/叉积 运算式(a,b和c粗体字,表示向量) a·b=|a||b|·cosθ a×b=c,其中|c|=|a||b|·sinθ,c的方向遵守右手定则 几何意义 向量a在向量b方向上的投影与向

    2023年04月08日
    浏览(9)
  • 图论的基本知识

    图论的基本知识

    1.数据结构 图论是数学的一个分支,研究图(Graph)的结构、性质以及它们之间的关系。图是由节点(或顶点)和边组成的一种数据结构,用于表示对象之间的关系。以下是一些图论的基本概念: 图(Graph): 图由节点(顶点)和连接节点的边组成。图可以分为有向图和无向

    2024年02月04日
    浏览(22)
  • 无人机基本知识

    无人机基本知识

    目录 前言 一、总体概况 二、机身 三、涵道 四、动力系统 1、 螺旋桨  2、电机 3、电调 4、电池 五、遥控器 六、自动驾驶仪(飞控) 1、组成 (1)传感器 (2)接口 2、飞控的连接 3、控制逻辑 4、作用 5、产品 七、地面站 八、数传 九、深度相机 总结 参考文献 四旋翼飞机

    2024年01月19日
    浏览(14)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包