精华内容
下载资源
问答
  • 四、多线程单线程的区别 五、主线程与子线程之间的关系 在软件层面,多线程就是能同时从多个路线同时执行处理。从软件的角度来说,线程可以看作是同时的。即便在单核处理器的电脑上也能实现多线程。但是多个线程...

    目录

    一、什么是进程

    二、什么是线程

    三、多线程处理的优点

    四、多线程与单线程的区别

    五、主线程与子线程之间的关系


    在软件层面,多线程就是能同时从多个路线同时执行处理。从软件的角度来说,线程可以看作是同时的。即便在单核处理器的电脑上也能实现多线程。但是多个线程毕竟是要在CPU上跑的,一定会有一个先后,所以这就涉及到了CPU的调度(时间片轮转)问题。

    一、什么是进程

    当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的。

    二、什么是线程

    线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。

    多线程:多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

    多线程的好处:可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。

    多线程的不利方面:

    1. 线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;
    2. 多线程需要协调和管理,所以需要CPU时间跟踪线程;
    3. 线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;
    4. 线程太多会导致控制太复杂,最终可能造成很多Bug;

    三、多线程处理的优点

    多线程编程的目的,就是"最大限度地利用CPU资源",当某一线程的处理不需要占用CPU而只和I/O,OEMBIOS等资源打交道时,让需要占用CPU资源的其它线程有机会获得CPU资源。

    每个程序执行时都会产生一个进程,而每一个进程至少要有一个主线程。这个线程其实是进程执行的一条线索,除了主线程外你还可以给进程增加其它的线程,也即增加其它的执行线索,由此在某种程度上可以看成是给一个应用程序增加了多任务功能。

    当程序运行后,您可以根据各种条件挂起或运行这些线程,尤其在多CPU的环境中,这些线程是并发运行的。

    多线程就是在一个进程内有多个线程。从而使一个应用程序有了多任务的功能。多进程技术也可以实现这一点,但是创建进程的高消耗(每个进程都有独立的数据和代码空间),进程之间通信的不方便(消息机制),进程切换的时间太长,这些导致了多线程的提出,对于单CPU来说(没有开启超线程),在同一时间只能执行一个线程,所以如果想实现多任务,那么就只能每个进程或线程获得一个时间片,在某个时间片内,只能一个线程执行,然后按照某种策略换其他线程执行。

    由于时间片很短,这样给用户的感觉是同时有好多线程在执行。但是线程切换是有代价的,因此如果采用多进程,那么就需要将线程所隶属的该进程所需要的内存进行切换,这时间代价是很多的。

    而线程切换代价就很少,线程是可以共享内存的。所以采用多线程在切换上花费的比多进程少得多。但是,线程切换还是需要时间消耗的,所以采用一个拥有两个线程的进程执行所需要的时间比一个线程的进程执行两次所需要的时间要多一些。即采用多线程不会提高程序的执行速度,反而会降低速度,但是对于用户来说,可以减少用户的响应时间。

    上述结果只是针对单CPU,如果对于多CPU或者CPU采用超线程技术的话,采用多线程技术还是会提高程序的执行速度的。因为单线程只会映射到一个CPU上,而多线程会映射到多个CPU上,超线程技术本质是多线程硬件化,所以也会加快程序的执行速度。

    优点:

    1. 同步应用程序的开发比较容易,但由于需要在上一个任务完成后才能开始新的任务,所以其效率通常比多线程应用程序低。如果完成同步任务所用的时间比预计时间长,应用程序可能会不响应。多线程处理可以同时运行多个过程。例如,文字处理器应用程序在您处理文档的同时,可以检查拼写(作为单独的任务)。由于多线程应用程序将程序划分成独立的任务,因此可以在以下方面显著提高性能。
    2. 多线程技术使程序的响应速度更快,因为用户界面可以在进行其他工作的同时一直处于活动状态。 
    3. 当前没有进行处理的任务可以将处理器时间让给其他任务。 
    4. 占用大量处理时间的任务可以定期将处理器时间让给其他任务。 
    5. 可以随时停止任务。 
    6. 可以分别设置各个任务的优先级以优化性能。

    是否需要创建多线程应用程序取决于多个因素。在以下情况下,最适合采用多线程处理:

    1. 耗时或大量占用处理器的任务阻塞用户界面操作。 
    2. 各个任务必须等待外部资源(如远程文件或 INTERNET 连接)。 

    四、多线程与单线程的区别

    1. 在单核的前提下,假如有10个任务。如果用单线程,那么我可以依次做这10个任务-----做完地一个做第二个做完第二个做第三个......而如果用多线程的话,等效于有一个任务队列,我run了这10个任务线程等于把这10个线程都插入了这个任务队列中,然后这10个任务去抢CPU。感觉上有点异步的味道:我不必等一个任务完成了才能执行第二个、我不必等这10个任务都完成了才能继续往下走。
    2. 多线程的产生并不是因为发明了多核CPU甚至现在有多个CPU+多核的硬件,也不是因为多线程CPU运行效率比单线程高。单从CPU的运行效率上考虑,单任务进程及单线程效率是最高的,因为CPU没有任何进程及线程的切换开销。
    3. 多线程的出现主要为了解决IO设备的读写速度往往比CPU的处理速度慢造成的单线程程序运行阻塞问题,一个极端的例子就是如果你需要用户在键盘上输入一个数据,当用户没有输入前,单线程程序就阻塞了,多线程程序就可以放个音乐或继续干一些程序中除了键盘输入外的工作,因此,多线程能提高因程序由于等待某个资源阻塞时其他资源的利用率(是利用率不是效率)。
    4. 因此多线程与单线程的最大区别,多线程程序能在等待某个IO操作时,继续完成非这个IO的其他工作,有利于提高完成整个任务的效果和速度。此外,多线程程序与单线程程序对程序设计也有不同的流程和结构,多线程需要考虑对静态变量等资源的操作互锁及程序执行的同步问题。

    生活举例:

    你早上上班,正要打卡的时候,手机响了,你如果先接了电话,等接完了,在打卡,就是单线程。如果你一手接电话,一手打卡。就是多线程。两件事的结果是一样的,你接了电话且打了卡。

    五、主线程与子线程之间的关系

    一个应用程序就对应一个进程,一个进程可有一个或多个线程,而一般有一个主线程。

    主线程与子线程之间的关系:

    • 默认情况,在新开启一个子线程的时候,他是前台线程,只有,将线程的IsBackground属性设为true;他才是后台线程。
    • 当子线程是前台线程,则主线程结束并不影响其他线程的执行,只有所有前台线程都结束,程序结束。
    • 当子线程是后台线程,则主线程的结束,会导致子线程的强迫结束。

    (个人理解,这样设计的原因:因为后台线程一般做的都是需要花费大量时间的工作,如果不这样设计,主线程已经结束,而后台工作线程还在继续,第一有可能使程序陷入死循环,第二主线程已经结束,后台线程即时执行完成也已经没有什么实际的意义)

    展开全文
  • 1.单线程和多线程的区别? 你早上上班,正要打卡的时候,手机响了。。你如果先接了电话,等接完了,在打卡,就是单线程。如果你一手接电话,一手打卡。就是多线程。这两件事的结果是一样的。。你接了电话且打了卡。 ...

    1.单线程和多线程的区别?

    你早上上班,正要打卡的时候,手机响了。。你如果先接了电话,等接完了,在打卡,就是单线程。
    如果你一手接电话,一手打卡。就是多线程。
    这两件事的结果是一样的。。你接了电话且打了卡。

    (1)最常见的一个线程例子:

    package com.ggx.thread;
    public class OnlyThread{
    	public static void main(String[] args){
    		System.out.println("我就是一个线程");
    	}
    }

    当程序启动运行时,就自动产生一个线程,主方法main就在这个主线程上运行。我们的程序都是由线程来执行的。

    (2)控制该线程的行为

    package com.ggx.thread;
    
    public class OnlyThread {
    
    	@SuppressWarnings("static-access")
    	public static void main(String[] args) {
    		Thread thread = Thread.currentThread();// 获取当前线程的引用(这里并没有创建新的线程)
    		thread.setName("我是孤零零的一个线程");// 设置当前线程名称
    		System.out.println(thread.getName() + ":正在运行");
    		for (int i = 0; i <= 5; i++) //当前线程循环睡眠
    		{
    			try 
    			{
    				System.out.println(thread.getName()+"第:" + i+"次睡眠,当前时间"+System.currentTimeMillis());
    				thread.sleep(5000);//让当前线程睡眠五秒钟
    				System.err.println(thread.getName()+"第:" + i+"次觉醒,当前时间"+System.currentTimeMillis());
    				thread.sleep(1000);//这里是为了方便区分控制台的输出,因为两次间隔毫秒数相同,打印的顺序会有错乱让线程睡了一秒,这样输出顺序容易观察
    				System.out.println();//换行
    			} catch (InterruptedException e) 
    			{
    				System.out.println(thread.getName()+"异常");
    				e.printStackTrace();
    			}
    		}
    	}
    }
    </span>
    

    程序运行结果:
    我是孤零零的一个线程:正在运行
    我是孤零零的一个线程第:0次睡眠,当前时间1439734065648
    我是孤零零的一个线程第:0次觉醒,当前时间1439734070663


    我是孤零零的一个线程第:1次睡眠,当前时间1439734071666
    我是孤零零的一个线程第:1次觉醒,当前时间1439734076668


    我是孤零零的一个线程第:2次睡眠,当前时间1439734077670
    我是孤零零的一个线程第:2次觉醒,当前时间1439734082673


    我是孤零零的一个线程第:3次睡眠,当前时间1439734083675
    我是孤零零的一个线程第:3次觉醒,当前时间1439734088687


    我是孤零零的一个线程第:4次睡眠,当前时间1439734089690
    我是孤零零的一个线程第:4次觉醒,当前时间1439734094694


    我是孤零零的一个线程第:5次睡眠,当前时间1439734095696
    我是孤零零的一个线程第:5次觉醒,当前时间1439734100711

    当程序启动运行时,就自动产生一个线程,主方法main就在这个主线程上运行。我们的程序都是由线程来执行的。

    线程在建立后并不马上执行run方法中的代码,而是处于等待状态。线程处于等待状态时,可以通过Thread类的方法来设置线程各种属性,如线程的优先级(setPriority)、线程名(setName)和线程的类型(setDaemon)等。

    注意:不能对已经启动的线程再次调用start()方法,否则会出现java.lang.IllegalThreadStateException异常。




    展开全文
  • 某些需要用到多线程的地方也有相应的解决方案替代方案。(推荐学习:PHP编程从入门到精通)多线程并不总是比单线程优,多线程可能会引入其他问题(例如:两个线程同时调用一个类里的同一个方法时,可能出现死锁的情况...

    PHP 从设计之初到流行起来都没有出现明显需要用多线程才能解决的需求。

    a7568d5d97f153d0826cb6e6ffe8a55a.png

    某些需要用到多线程的地方也有相应的解决方案和替代方案。(推荐学习:PHP编程从入门到精通)

    多线程并不总是比单线程优,多线程可能会引入其他问题(例如:两个线程同时调用一个类里的同一个方法时,可能出现死锁的情况)。

    你可以这样理解对应一个客户的一个页面请求处理的php 是单线程处理的, 这样一来就可以自上而下的去编辑/理解代码中的业务逻辑了, 但是 php 可以同时开很多线程来处理 很多用户请求的同一个PHP , 所以 php 也可以看成是"多线程"的。

    每个PHP文件的执行是单线程的,但是,服务器(apache/nigix/php-fpm)是多线程的。每次对某个PHP文件的访问服务器都会创建一个新的进程/线程,用来执行对应的PHP文件。

    也就是说对于一个请求来说PHP是单线程的,但是多个请求间是并发的。

    其实一般写PHP程序认为是单线程的就可以了;多个请求之间相互的关系就是,有些时候读写数据库,文件,session等会加锁,会导致后面的请求挂起等待前面的请求执行完才继续。

    至于协程,只能说是一种新的程序执行流程(旧的是顺序,判断,循环),本质是也是单线程的

    所以准确的说php是单线程的,一定程度上也可以看成是“多线程”!!!

    展开全文
  • 例如开启了超线程技术Pentium4530与PentiumD530在操作系统中都同样被识别为两颗处理器,它们究竟是不是一样呢?这个问题确实具有迷惑性。其实,可以简单地把双核心技术理解为两个"物理"处理器,是一种"硬"方式...

    超线程技术已经不是什么新鲜事物了,但普通用户可能与双核心技术区分不开。例如开启了超线程技术的Pentium 4 530与Pentium D 530在操作系统中都同样被识别为两颗处理器,它们究竟是不是一样的呢?这个问题确实具有迷惑性。

    其实,可以简单地把双核心技术理解为两个"物理"处理器,是一种"硬"的方式;而超线程技术只是两个"逻辑"处理器,是一种"软"的方式。 其实这方面更详细的还可以在52硬件论坛查到(http://bbs.52hardware.com)

    从原理上来说,超线程技术属于Intel版本的多线程技术。这种技术可以让单CPU拥有处理多线程的能力,而物理上只使用一个处理器。超线程技术为每个物理处理器设置了两个入口-AS(Architecture State,架构状态)接口,从而使操作系统等软件将其识别为两个逻辑处理器。这两个逻辑处理器像传统处理器一样,都有独立的IA-32架构,它们可以分别进入暂停、中断状态,或直接执行特殊线程,并且每个逻辑处理器都拥有APIC(Advanced Programmable Interrupt Controller,高级可编程中断控制器)。虽然支持超线程的Pentium 4能同时执行两个线程,但不同于传统的双处理器平台或双内核处理器,超线程中的两个逻辑处理器并没有独立的执行单元、整数单元、寄存器甚至缓存等等资源。它们在运行过程中仍需要共用执行单元、缓存和系统总线接口。在执行多线程时两个逻辑处理器均是交替工作,如果两个线程都同时需要某一个资源时,其中一个要暂停并要让出资源,要待那些资源闲置时才能继续。因此,超线程技术所带来的性能提升远不能等同于两个相同时钟频率处理器带来的性能提升。可以说Intel的超线程技术仅可以看做是对单个处理器运算资源的优化利用。

    而双核心技术则是通过"硬"的物理核心实现多线程工作:每个核心拥有独立的指令集、执行单元,与超线程中所采用的模拟共享机制完全不一样。在操作系统看来,它是实实在在的双处理器,可以同时执行多项任务,能让处理器资源真正实现并行处理模式,其效率和性能提升要比超线程技术要高得多,不可同日而语。

    展开全文
  • 什么是进程?当一个程序开始运行时,它就是一个进程,进程包括运行中程序程序所使用到...多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同线程来执行不同任务,也就是说允许单个程...
  • 一、线程、进程、多线程1、线程与进程定义进程:进程是系统进行资源分配调度的基本单位,是操作系统中一个运行的程序,是线程的容器;线程:线程是处理机调度的最小单位,包含在进程中,是进程中实际运作单位;一...
  • LNMP 架构下 PHP 采用 FPM 模式运行(php-fpm worker 进程采用单线程模式运行,同步阻塞,即一个worker 只会处理一个请求,处理完了一个才会处理下一个)而 LAMP 架构下,PHP 是作为 apache mod 运行,印象中 apache...
  • Qt GUI程序中单线程和多线程的区别

    千次阅读 2018-09-21 10:31:55
    转载:https://blog.csdn.net/hulifangjiayou/article/details/50170739 ... Qt应用程序exec后就会生成一个线程,这个线程就是主线程,在GUI程序中也称为GUI线程。主线程也是唯一允许创建QApplication或Q...
  • 单线程和多线程的区别

    千次阅读 2007-02-28 11:43:00
    通常多线程的应用不是为了提高运行效率,而是为了提高资源使用效率。比如你的应用程序需要访问网络,因为网络有延时,如果在界面线程访问,那么在网络访问期间界面将无法响应用户消息,这是就应该使用多线程。 如果...
  • 所以说浏览器想要提高下载速度,就得采用多线程的下载方式,不过到目前为止,Chrome多线程下载已经支持了,只不过大家都不知道而已。Chrome默认还是单线程下载,如果想要谷歌多线程下载,就要手动开启,下面听MacW小...
  • 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中程序程序所使用到内存系统资源。...多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同线程来执行不同任务, 也...
  • 单线程多线程的区别

    万次阅读 2017-11-27 11:03:18
    什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括...而一个进程又是由线程所组成。 什么是线程线程是程序中一个执行流,每个线程都有自己专有寄存器(栈指针、程序计数器等),但代码区
  • 单线程和多线程区别

    2014-09-27 08:49:00
    通常多线程的应用不是为了提高运行效率,而是为了提高资源使用效率。比如你的应用程序需要访问网络,因为网络有延时,如果在界面线程访问,那么在网络访问期间界面将无法响应用户消息,这是就应该使用多线程。 如果...
  • 单线程和多线程

    2020-02-01 16:38:32
    单线程和多线程的区别又是什么呢?下面我们来看看它们的区别以及优缺点分析及实例展示。 一、线程的含义 线程:每一个任务称为一个线程,线程不能独立的存在,它必须是进程的一部分 单线程:般常见的Java应用程序都...
  • 进程 : 操作系统分配资源最小单元 ; 线程 : 是操作系统调度最小单元;...(但是当同一段代码在同一时间有多个请求访问,这就涉及线程安全问题啦,也就是说线程安全,多线程编程啦) 这里要说一句题外话...
  • 线程和进程 概念 进程(process):是指具有已一定功能独立程序,是系统资源分配基本单位,在内存中有其完备数据空间和代码空间,拥有完整虚拟空间地址。一个进程所拥有数据和变量只属于它自己。 线程...
  • ## 定时任务默认单线程多线程和异步方法的区别 springboot @schedule和@Async定时任务的异步 同步 任务并发
  • 一个进程是由一或个线程组成,进程只负责资源调度分配,线程才是程序真正执行单元,负责代码执行。 单线程 每个正在运行程序(即进程),至少包括一个线程,这个线程叫主线程 主线程在程序启动时被创建...
  • 先了解下CPU的简单运行原理:它运行速度非常快,1s内可以运行成千上万次,一个核心可以把1s切分成...再了解下单线程和多线程的区别:先看下单进程,顾名思义,就是一条进程,类似于单向公路上只有一条车道,每次只能...
  • 先了解下CPU的简单运行原理:它运行速度非常快,1s内可以运行成千上万次,一个核心可以把1s切分成...再了解下单线程和多线程的区别:先看下单进程,顾名思义,就是一条进程,类似于单向公路上只有一条车道,每次只能...
  • 它就是一个进程,每个进程都有自己独立地址空间(内存空间),每当用户启动一个进程是时,操作系统就会为该进程分配一个独立内存空间,让应用程序在这个独立内存空间中运行,而一个进程又是由线程所组成. ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,845
精华内容 1,938
关键字:

单线程和多线程的区别