多线程与进程
前言
最近呢,有好多初入JAVA领域的初学者问我多线程到底是什么呢?是不是就是进程啊,所有人的问题几乎都一模一样,说在网上看了好多文章,都说的特别高深,看完看不明白。
那么到底什么是多线程呢?它到底和进程有什么区别呢?如何才能让初学者也能明白这个东西到底是什么?下文就让我们来站在小白的角度来深入的解析一下这个在日常编程领域无处不在的东西把!
线程
线程,有时被称为轻量级进程( Lightweight Process,LWP),是程序执行流的最小单
元。一个标准的线程由线程D,当前指令指针(PC),寄存器集合和堆栈组成。另外
线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系
统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程
共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多
个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断
性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条
件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞
状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至
少有一个线程,若程序只有一个线程,那就是程序本身
线程优先级
虽然我们说线程是并发运行的。然而事实常常并非如此。正如前面谈到的,当系统中
有一个CPU时,以某种顺序在单CPU情况下执行多线程被称为调度( scheduling)
Java釆用的是一种简单、固定的调度法,即固定优先级调度。这种算法是根据处于可
运行态线程的相对优先级来实行调度。当线程产生时,它继承原线程的优先级。在需
要时可对优先级进行修改。在任何时刻,如果有多条线程等待运行,系统选择优先级N
最高的可运行线程运行。只有当它停止、自动放弃、或由于某种原因成为非运行态低
优先级的线程才能运行。如果两个线程具有相同的优先级,它们将被交替地
ava实时系统的线程调度算法还是强制性的,在任何时刻,如果一个其他线程优先
级都高的线程的状态变为可运行态,实时系统将选择该线程来越个应用程序可
以通过使用线程中的方法 setPriority(int),来设置线程的优先级大小
进程
狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。
广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。 [3]
进程是操作系统中最基本、重要的概念。是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。
是不是看了上面的还是一脸懵逼呢?看的云里雾里。放心,一脸懵逼的进来是不会让你一脸懵逼的出去的。来,看这里!我们来举个例子来说一下进程和线程的联系和区别你就会明白了。
假设用户启动了一个窗口中的数据库应用程序,这个数据库应用程序就是咱们的进程,操作系统就将对数据库的调用表示为一个进程。假设用户要从数据库中产生一份工资单报表,并传到一个文件中,这是一个子任务;在产生工资单报表的过程中,用户又可以输人数据库查询请求,这又是一个子任务。这样,操作系统则把每一个请求――工资单报表和新输人的数据查询表示为数据库进程中的独立的线程。线程可以在处理器上独立调度执行,这样,在多处理器环境下就允许几个线程各自在单独处理器上进行。操作系统提供线程就是为了方便而有效地实现这种并发性。是不是很清楚了,那么再想一下,为什么明明单线程也可以实现非要用多线程呢?
(1)易于调度。
(2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。
(3)开销少。创建线程比创建进程要快,所需开销很少。。
(4)利于充分发挥多处理器的功能。通过创建多线程进程(即一个进程可具有两个或更多个线程),每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。
进程和线程的区别
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。 同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。
(3)处理机分给线程,即真正在处理机上运行的是线程。
(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
怎么样?是不是很清楚了?那么咱们今天的文章就到这里啦。是不是又学到了!如果还有想听的记得在下方留言哦。说不定下一篇就会讲你想知道的内容。