黑马程序员技术交流社区
标题:
线程和进程的关系和区别
[打印本页]
作者:
风雪再现
时间:
2013-5-6 17:25
标题:
线程和进程的关系和区别
只是知道一个进程可以包括多个线程,但是不知道在使用的时候一个进程如何调用线程,请问一下怎么理解进程、线程??
作者:
张伟86
时间:
2013-5-6 17:47
本帖最后由 张伟86 于 2013-5-6 18:41 编辑
如果抛弃学术术语,不看操作系统的进程和线程章节的话,只讨论我们在日常编程中所涉及到的应用的话,你需要明白的就是一个程序运行后,创建了一个进程,并为这个进程分配了资源;进程被创建后,会创建一个主线程,这个主线程调用进程中提供的资源进行程序处理。主线程可以再创建线程,被创建的线程同时享有进程的资源,并且可以与主进程同时运行(并行)。主线程可以销毁其他线程,而其他线程除了不能销毁主线程之外可以操作另外的线程。主线程生命期结束后,进程也就销毁了。
多线程使得我们可以在执行程序时,使得人们在这个程序中,获得更好的人机交互体验。
例如:你编写了一个程序,里面实现的功能有计算10000个数的和并且输出(假设这个输出时间是10秒钟),还有个功能是计算1000个数的和;在菜单栏中我们实现了这2个功能(就是具有相应的执行按钮);如果是单进程的话,你点击菜单使用了第一个功能计算并输出,这时你点击你的菜单想要执行第二个功能,你会发现你这个程序在它输出的10秒钟内就如同死机了一般,是不能响应其他的操作的;但如果是多线程的话,那你可以在第一个功能使用的同时进行使用第二个功能,还可以影响第一个功能。放到现实生活中,举个例子,你用mediaplayer放电影,如果是单线程,那你这个电影没放完之前如果你点程序的其他功能就如同死机一般,而恰恰你会发现它不会说非要让你放完这个才能做其他操作,它内部定义了线程函数,使用多线程技术,令我们可以在播放的同时,按一下暂停,去完成暂停电影播放的这样操作。
PS:不知道你明白了没有,我呢,就是当给自己总结了下吧,用自己理解的方式去总结知识,很有意思的。更简单点来说,就是如果你要使你的程序,在做一件事情的时候可以同时做另外一件事情,你就需要使用多线程。
PS2:刚还看到你需要进程与线程的区别,这2个区别实际上不用谈的。编程中感觉用不上。但要是说区别的话,那就是进程只控制程序运行时的实例的资源的管理,线程完成程序的功能。为什么说用不上呢?你编写了一个程序,一般来说只需要管你这个程序中的功能实现,而不需要去管我这个程序系统怎么去分配资源,去管理资源。找工作时,只说会使用多线程,就是这么个道理。
作者:
付银攀
时间:
2013-5-6 18:13
进程是表示资源分配的基本单位,又是调度运行的基本单位;线程是进程中执行运算的最小单位,也可理解为执行路径;
一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位,比如你运行个qq,就有个qq的进程,系统会分配给该进程资源和空间,但是一个qq进程执行不同的操作,比如你开着聊天窗口聊天,还打开着qq更新程序在更新版本,这是就有两个线程(最少有2个),这两个线程占用的资源和空间都是系统分配给qq进程的。
更详细的看毕老师的视频关于多线程这块的内容吧
作者:
殇_心。
时间:
2013-5-6 18:20
进程:一个正在执行的程序。
线程:进程执行的一条路径。一个进程至少有一个线程。
举个例子:
当要运行一个java程序时,JVM首先会找到main函数,
然后从main函数开始执行,此时,程序就成为一个进程,
既然是进程肯定有线程的存在。
此时的线程就是主线程,主线程会向下顺序执行代码。
继承Thread类或者实现Runnable接口。调用start方法。
由主线程开辟另一个或多个线程,让这些线程都去执行代码。
作者:
zms2100
时间:
2013-5-6 18:49
个人理解,最自白的解释方式:
1、进程,你在电脑里启动一个程序,就会创建一个进程,这个不需要我们设置的,只能控制程序的运行、关闭(例如在出现什么情况时关闭程序);
2、线程,就像你要煮一餐饭(即代表一个程序或者说是进程),你可以煮完饭再去炒菜(这样就算是单线程),或者一边煮饭、一边炒菜等(这个就是多线程,你需要程序同时做什么动作就设置多少个线程(执行run方法))。
这个应该可以辅助你理解进程和线程的定义,另外在Window中你启动了一个程序(即创建一个进程),系统就会给你分配一个线程(这个默认的线程就是你程序的主线程),至于我们要做的就是根据需要给我们的程序再添加创建所需其他线程。
作者:
郎吉祥
时间:
2013-5-6 20:02
楼上正解。自己理解了才是学会了。复制粘贴谁都会。
顶一个!
作者:
张伟86
时间:
2013-5-6 20:22
呀,我复制了许多东西啊,怎么办?
作者:
许庭洲
时间:
2013-5-7 06:17
1. 线程与进程二者都定义了某种边界,不同的是进程定义的是应用程序与应用程序之间的边界,不同的进程之间不能共享代码和数据空间,而线程定义的是代码执行堆栈和执行上下文的边界;
2. 一个进程可以包括若干个线程,同时创建多个线程来完成某项任务,便是多线程;
3. 而同一进程中的不同线程共享代码和数据空间。
作者:
风雪再现
时间:
2013-5-7 14:30
张伟86 发表于 2013-5-6 17:47
如果抛弃学术术语,不看操作系统的进程和线程章节的话,只讨论我们在日常编程中所涉及到的应用的话,你需要 ...
谢谢,回答的很详细,很有用
作者:
高文咪
时间:
2013-5-7 15:11
一个程序进程只能有一个,线程却可以有多个,当你运行一个程序时一个进程就开启了,他里面会包含一个或多个线程同时在运行;
作者:
郭东生
时间:
2013-5-9 08:46
学习了,
作者:
余尚勇
时间:
2013-5-10 13:10
进程和线程的区别
说法一:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行
说法二:进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:
简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
说法三:多线程共存于应用程序中是现代操作系统中的基本特征和重要标志。用过UNIX操作系统的读者知道进程,在UNIX操作系统中,每个应用程序的执行都在操作系统内核中登记一个进程标志,操作系统根据分配的标志对应用程序的执行进行调度和系统资源分配,但进程和线程有什么区别呢?
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:
线程的划分尺度小于进程,使得多线程程序的并发性搞。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
进程(Process)是最初定义在Unix等多用户、多任务操作系统环境下用于表示应用程序在内存环境中基本执行单元的概念。以Unix操作系统为例,进程是Unix操作系统环境中的基本成分、是系统资源分配的基本单位。Unix操作系统中完成的几乎所有用户管理和资源分配等工作都是通过操作系统对应用程序进程的控制来实现的。
C、C++、Java等语言编写的源程序经相应的编译器编译成可执行文件后,提交给计算机处理器运行。这时,处在可执行状态中的应用程序称为进程。从用户角度来看,进程是应用程序的一个执行过程。从操作系统核心角度来看,进程代表的是操作系统分配的内存、CPU时间片等资源的基本单位,是为正在运行的程序提供的运行环境。进程与应用程序的区别在于应用程序作为一个静态文件存储在计算机系统的硬盘等存储空间中,而进程则是处于动态条件下由操作系统维护的系统资源管理实体。多任务环境下应用程序进程的主要特点包括:
●进程在执行过程中有内存单元的初始入口点,并且进程存活过程中始终拥有独立的内存地址空间;
●进程的生存期状态包括创建、就绪、运行、阻塞和死亡等类型;
●从应用程序进程在执行过程中向CPU发出的运行指令形式不同,可以将进程的状态分为用户态和核心态。处于用户态下的进程执行的是应用程序指令、处于核心态下的应用程序进程执行的是操作系统指令。
在Unix操作系统启动过程中,系统自动创建swapper、init等系统进程,用于管理内存资源以及对用户进程进行调度等。在Unix环境下无论是由操作系统创建的进程还要由应用程序执行创建的进程,均拥有唯一的进程标识(PID)。
说法四:应用程序在执行过程中存在一个内存空间的初始入口点地址、一个程序执行过程中的代码执行序列以及用于标识进程结束的内存出口点地址,在进程执行过程中的每一时间点均有唯一的处理器指令与内存单元地址相对应。
Java语言中定义的线程(Thread)同样包括一个内存入口点地址、一个出口点地址以及能够顺序执行的代码序列。但是进程与线程的重要区别在于线程不能够单独执行,它必须运行在处于活动状态的应用程序进程中,因此可以定义线程是程序内部的具有并发性的顺序代码流。
Unix操作系统和Microsoft Windows操作系统支持多用户、多进程的并发执行,而Java语言支持应用程序进程内部的多个执行线程的并发执行。多线程的意义在于一个应用程序的多个逻辑单元可以并发地执行。但是多线程并不意味着多个用户进程在执行,操作系统也不把每个线程作为独立的进程来分配独立的系统资源。进程可以创建其子进程,子进程与父进程拥有不同的可执行代码和数据内存空间。而在用于代表应用程序的进程中多个线程共享数据内存空间,但保持每个线程拥有独立的执行堆栈和程序执行上下文(Context)。
基于上述区别,线程也可以称为轻型进程 (Light Weight Process,LWP)。不同线程间允许任务协作和数据交换,使得在计算机系统资源消耗等方面非常廉价。
线程需要操作系统的支持,不是所有类型的计算机都支持多线程应用程序。Java程序设计语言将线程支持与语言运行环境结合在一起,提供了多任务并发执行的能力。这就好比一个人在处理家务的过程中,将衣服放到洗衣机中自动洗涤后将大米放在电饭锅里,然后开始做菜。等菜做好了,饭熟了同时衣服也洗好了。
需要注意的是:在应用程序中使用多线程不会增加 CPU 的数据处理能力。只有在多CPU 的计算机或者在网络计算体系结构下,将Java程序划分为多个并发执行线程后,同时启动多个线程运行,使不同的线程运行在基于不同处理器的Java虚拟机中,才能提高应用程序的执行效率。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2