什么是多线程

什么是多线程

时间:2023-10-01 14:37:01

  多线程,是指从软件或者硬件上实现多个线程并发执行的技术。

  具有多线程本事的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种本事的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。在一个程序中,这些独立运行的程序片段叫作“线程”,利用它编程的概念就叫作“多线程处理”。具有多线程本事的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。

  相关阅读:

  多线程是一个比较轻量级的方法来实现单个应用程序内多个代码执行路径。在系统级别内,程序并排执行,系统分配到每个程序的执行时间是基于该程序的所需时间和其他程序的所需时间来决定的。然而在每个应程序的内部,存在一个或多个执行线程,它同时或在一个几乎同时发生的方式里执行不一样的任务。

  无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行。可是机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行。改变这种状况能够从两个角度出发:对于单核处理器,能够将多个步骤放到不一样的线程,这样一来用户完成UI操作后其他后续任务在其他线程中,当CPU空闲时会继续执行,而此时对于用户而言能够继续进行其他操作;对于多核处理器,如果用户在UI线程中完成某个操作之后,其他后续操作在别的线程中继续执行,用户同样能够继续进行其他UI操作,与此同时前一个操作的后续任务能够分散到多个空闲CPU中继续执行(当然具体调度顺序要根据程序设计而定),及解决了线程阻塞又提高了运行效率。

  当用户播放音频、下载资源、进行图像处理时往往期望做这些事情的时候其他操作不会被中断或者期望这些操作过程中更加顺畅。在单线程中一个线程只能做一件事情,一件事情处理不完另一件事就不能开始,这样势必影响用户体验。早在单核处理器时期就有多线程,这个时候多线程更多的用于解决线程阻塞造成的用户等待(通常是操作完UI后用户不再干涉,其他线程在等待队列中,CPU一旦空闲就继续执行,不影响用户其他UI操作),其处理本事并没有明显的变化。如今无论是移动操作系统还是PC、服务器都是多核处理器,于是“并行运算”就更多的被提及。一件事情我们能够分成多个步骤,在没有顺序要求的情景下使用多线程既能解决线程阻塞又能充分利用多核处理器运行本事。

  下图反映了一个包含8个操作的任务在一个有两核心的CPU中创立四个线程运行的情景。假设每个核心有两个线程,那么每个CPU中两个线程会交替执行,两个CPU之间的操作会并行运算。单就一个CPU而言两个线程能够解决线程阻塞造成的不流畅问题,其本身运行效率并没有提高,多CPU的并行运算才真正解决了运行效率问题,这也正是并发和并行的区别。当然,不管是多核还是单核开发人员不用过多的担心,因为任务具体分配给几个CPU运算是由系统调度的,开发人员不用过多关心系统有几个CPU。开发人员需要关心的是线程之间的依靠关系,因为有些操作必须在某个操作完成完才能执行,如果不能保证这个顺序势必会造成程序问题。

  多线程原理

  有些程序是一条直线,起点到终点;有些程序是一个圆,不断循环,直到将它切断。直线的如简单的HelloWorld,运行打印完,它的生命周期便结束了,像昙花一现那样;圆如操作系统,一向运行直到你关机。

  一个运行着的程序就是一个进程或者叫做一个任务,一个进程至少包含一个线程,线程就是程序的执行流。Mac和iOS中的程序启动,创立好一个进程的同时,一个线程便开始运行,这个线程叫主线程。主线程在程序中的地位和其他线程不一样,它是其他线程最终的父线程,且所有界面的显示操作即AppKit或UIKit的操作必须在主线程进行。

  系统中的每一个进程都有自我独立的虚拟内存空间,而同一个进程中的多个线程则共用进程的内存空间。每创立一个新的线程,都需要一些内存(如每个线程有自我的Stack空间)和消耗必须的CPU时间。另外当多个线程对同一个资源出现争夺的时候需要注意线程安全问题。

  扩展阅读:

  1.多线程的概念

  什么是先线程什么又是进程

  1.什么是进程:进程是计算机中关于某数据集合的一次活动,是系统进行资源分配的基本单位,是计算机结构的基础.在早期面向进程的计算机设计结构中,进程是程序的最基本的执行实体.在当代面向线程设计的计算机结构中,进程是线程的容器,程序是指令,数据及其组织形式的集合,线程是程序的实体.总之进程能够理解为一个能够独立运行的程序单位,进程是由一个或多个线程组成的,每一个线程就是进程中的一条执行路径.

  2.为什么要使用多线程或者说使用多线程有什么好处

  1.在一个程序的执行过程中有许多耗时的操作,如数据库的读写,磁盘的IO操作等,都是十分耗时的,如果使用单线程就必须等待这些操作执行完才能去执行其他的操作,使用多线程能够将耗时操作放在后台继续执行的同时,执行其他操作.提高效率,准确的说是提高cpu的使用率,对于单核cpu来说他并不是每个时刻都在使用,比如进行IO操作时,IO操作是比较费时的,在读取磁盘的时候,cpu是处于等待状态,并没有执行任何操作,这个时候我们就能够用cpu等待的这段时间,让他去执行别的操作,从而提高效率.

  3.使用多线程有什么缺点

  1.使用多线程很消耗系统资源,因为多线程需要开辟内存,并且线程切换也是需要时间的.

  2.线程的终止会对程序有影响

  3.多个线程之间存在共享数据,容易出现线程死锁的情景

  4.多线程在高并发的场景中的作用

  高并发是指在程序运行中,短时间内遇到很多的用户请求,执行很多的对资源的请求或者对数据库的操作,高并发处理不好的话,不仅仅降低了用户的体验,还有可能造成宕机,严重的甚至发生oom,系统停止工作,解决高并发的问题需要从多方面进行解决如硬件,网络,系统架构,开发语言的选取,数据结构的应用,算法优化,数据库优化,而多线程在高并发的情景下的作用就是充分利用计算机资源,使计算机在每一时刻都能到达最大的利用率.[本内容由 首页 / 整理]

  5.线程的创立和常用方法

  1.线程的创立

  线程的创立主要有俩种方法,一.是继承Thread类,重写run方法,另一种就是实现Runable接口,重写run方法.线程的启动调用start方法.其他的还有经过匿名内部类的方法创立,实现callable接口

  在java中无论使用哪种方式创立线程,本质上都是创立Thread类,另外callable是有回到值的,Thread只能单继承

  2.常用方法

  currentThread();获取当前线程

  isAlive();确定线程是否存活

  join();强制运行线程其他线程无法执行

  sleep();休眠不会释放锁

  interrupt();线程中断

  setDaemon(true);线程后台执行

  getPriority();获取线程优先级

  setPriotiy();设置线程优先级

  yield();暂停当前线程让当前线程处于就绪状态不会释放锁

  wait();等待会释放锁

  notify();唤醒线程让线程重新处于就绪状态

  notifyAll();唤醒所有线程