多线程基础

Posted depthch

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程基础相关的知识,希望对你有一定的参考价值。

多线程是企业面试必备题,尤其是中级和高级程序员,基本上百分百都会考多线程。

现在很多系统(windows,macOS,Linux)都可以执行多任务,比如同时运行:QQ、音乐、浏览器,电脑中CPU执行代码都是一条一条顺序执行的,但是,即使是单核cpu,也可以运行多个任务。因为操作系统执行多任务实际上就是让CPU对多个任务轮流交替执行

列如,我们现在要做三样事情:洗碗、洗衣服、做作业,假如每件事情都要20分钟才能做完,如果一个人在洗碗的同时抽空一边洗衣服和写作业,这样轮流做下去就像是三个人同时一起做这三件事情。

 

线程与进程的区别

什么是进程?

在计算机中,我们把一个任务称为一个进程,在电脑上每打开一个应用程序,CPU就会创建一个进程,在一个应用程序运行的过程中,至少会有一个进程。

进程是执行中的程序,一个操作系统可以有多个进程,任何一个软件只要能运行起来,那么它肯定有一个进程展示的

我们在电脑上打开"任务管理器",可以看到我们电脑上正在运行的进程

技术图片

现在打开一个QQ,再来看任务管理器,

技术图片

技术图片

什么是线程?

有些进程内部还需要多个子任务,列如,我们使用电脑管家的时候,可以同时进行垃圾清理和系统扫描,我们把子任务称为线程。

在一个进程中,一定有一个线程,这个线程就是主线程。

进程:正在运行的程序,他是线程的集合,由至少一个或多个线程组成。

线程:进程中独立运行的一条执行路径

 

在进程中,程序代码是怎么执行的?

使用多线程,可以提高程序运行效率,多个线程之间互不影响,因为都在自己独立运行。

 

为什么要使用多线程?

为了提高程序效率,多线程就类似N个工人"同一时间"去干同一件事情,比一个人"同一时间"去干快N倍

 

多线程的应用场景

多线程下载、QQ、爬虫、前端开发ajax(异步上传)

拿爬虫来说,我们在请求网页的时候就可能会出现延迟或超时,这时如果是单线程的话,就会一直等待请求响应,这样就会浪费很多实际,很大程度降低了程序效率。如果使用的是多线程的话,当第一个请求延迟了,cpu就会先去执行第二个请求或其他请求,不需要等待第一个请求是否延迟,因为每条子线程执行的过程是互补干扰的。

 

什么是同步?什么是异步?

同步(单线程):代码按顺序执行一条一条下来。

异步(多线程):同时多个任务一起执行,每个任务互不干扰。

 

创建线程有哪些方式?

1.使用继承Thread类方式 继承Thread重写run方法

  class DemoThread01 extends Thread
  {
      public void run()
      {

    // 需要执行的代码
      }
   }

 测试代码:

  new DemoThread01().start()   //启动线程

2.使用实现Runnable接口方式

  class DemoThread02 implements Runnable
  {
      public void run()
      {
        // 需要执行的代码
      }
  }

 测试代码

  DemoThread02 run = new DemoThread02();

  new Thread(run).start()   //启动线程

3.使用匿名内部类方式

 Thread thread = new Thread(new Runnable() {

    public void run() {

        //需要执行的代码

    }

});

thread. start() ;           //启动线程

 

Thread常用API

  getId()  获取线程id

  currentThread()  获取当前线程对象

  getName()   获取线程名称

  sleep()  线程休眠

常用线程构函数

  Thread()   分配一个新的Thread对象

  Thread(String name)   分配一个新的Thread对象,具有指定的name正如其名

  Thread(Runnable r)  分配一个新的Thread对象

  Thread(Runable r,String name)   分配一个新的Thread对象,具有指定的name正如其名

 

守护线程和非守护线程

什么是守护线程、非守护线程?

守护线程,和main相关。

用户线程,用户自己创建的线程,用户创建线程,如果主线程停止掉,不会影响用户线程

守护线程,有一个特征:和主线程一起销毁。

非守护线程特征:和主线程互不影响

 

创建守护线程?  Thread对象调用setDaemon(true)方法,参数为true,可以将该线程设置为守护线程

 

多线程运行状态

新建—>就绪—>运行—>休眠—>死亡

当我们创建一个Thread对象时就是新建状态

调用start()方法后线程并不会马上运行,而是处于一个就绪状态,它需要等待拿到cpu的执行权之后才真正运行,休眠状态在我们调用sleep方法的时候线程就处于一个休眠状态,当所有任务执行完毕后线程就停止了,就是死亡状态

 

join方法介绍

join方法的作用?  当线程A调用线程B的join方法后,线程A就需要等待线程B执行完毕之后再继续执行。

好比我们现在需要 洗衣服和晾衣服,这时要晾衣服的人就必须等待洗衣服的人洗完才可以晾衣服。

以上是关于多线程基础的主要内容,如果未能解决你的问题,请参考以下文章

多线程Java多线程学习笔记 | 多线程基础知识

Java基础教程:多线程基础——线程的状态

java 基础学习:多线程04

并发编程多线程基础

多线程基础

Java基础学习多线程基础面试题形式