zoukankan      html  css  js  c++  java
  • 多线程基础

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

    现在很多系统(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执行完毕之后再继续执行。

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

  • 相关阅读:
    WPF自定义RoutedEvent事件代码段
    微信聊天和通讯录按钮样式
    【转】c#、wpf 字符串,color,brush之间的转换
    模块式开发
    通过属性进行浅拷贝
    【转】string.Format对C#字符串格式化
    酷学习笔记——前言
    C# 连蒙带骗不知所以然的搞定USB下位机读写
    C# Ioc、DI、Unity、TDD的一点想法和实践
    虹软人脸识别速度测试征集
  • 原文地址:https://www.cnblogs.com/DepthCh/p/12160415.html
Copyright © 2011-2022 走看看