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

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

🦁 掌握基本概念

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模板网!

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

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

相关文章

  • 光耦基本知识

     1、光耦的种类          高速光耦、低速光耦;                 高速:6N137,HCPL-2601                 低速:PC817          线性光耦、非线性光耦;         以6N136与6N137为例         6N136是1Mbps的高速光耦,但是输出端采用的是 晶体管 ,所以输出电流的大小

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

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

    2024年01月24日
    浏览(43)
  • Git基本知识

    Git 官网: https://book.git-scm.com/ Git 完整命令手册地址: http://git-scm.com/docs Git 中文文档: https://git-scm.com/book/zh/v2 Git 各平台安装包下载地址为: http://git-scm.com/downloads 2.1 Windows下的安装 安装包下载地址: https://github.com/git-for-windows/git/releases/ https://gitforwindows.org/ 官网慢,可以用

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

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

    2024年01月19日
    浏览(35)
  • shell基本知识

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

    2024年02月12日
    浏览(46)
  • 图论的基本知识

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

    2024年02月04日
    浏览(48)
  • linux进程基本知识

    1.什么是程序,什么是进程? 程序是静态的概念,例如 gcc xx.c -o pro 磁盘中生成pro文件,叫做程序 进程是程序的一次运行活动,意思是程序跑起来了,系统中就多了一个进程 2.如何查看系统中有哪些进程? (1)使用ps指令查看 实际工作中通常配合grep来查找程序中是否存在某

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

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

    2024年02月15日
    浏览(39)
  • 前端基本知识介绍

    目录 一.前端三剑客 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日
    浏览(35)
  • Linux 基本知识

    FHS(Filesystem Hierarchy Standard)—— 文件系统层次化标准 。 Filesystem Hierarchy Standard(文件系统层次化标准)的缩写,多数Linux版本采用这种文件组织形式,类似于Windows操作系统中c盘的文件目录,FHS采用树形结构组织文件。FHS定义了系统中每个区域的用途、所需要的最小构成的

    2024年02月16日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包