多线程之浅谈线程概念

要学习一个技术我们首先是要理解其本质的定义,仅仅有这种前提下你才干更快更准确的去学习和使用他。为了更好的去学习多线程我们必去先  明确什么是线程。我将会依依说明为什么要依次理解的原因。

首先们我来看看2个w一个h的问题,

1什么是多线程?

2为什么要用多线程?

3怎么使用多线程?

第一个问题的官方回答是:

多线程(英语:multithreading)。是指从软件或者硬件上实现多个线程并发运行的技术。从简单的文字的定义上看,好像就是同一时候做“多件事”,而实际情况就是这样,仅仅是它里面还有很多其它要注意的细节和有趣的事情。

在聊聊第2个问题,标准回答是:

1.耗时的操作使用线程,提高应用程序响应

2.并行操作时使用线程。如C/S架构的server端并发线程响应用户的请求。

3.多CPU系统中,使用线程提高CPU利用率

4.改善程序结构。

一个既长又复杂的进程能够考虑分为多个线程,成为几个独立或半独

立的执行部分,这种程序会利于理解和改动。

以上对这两个问题的回答比較的生硬和官方,我个人并不喜欢这种回答,由于不能“个性本地化”的理解,我觉得上述的前两个问题应该是一个问题。而要回答这个问题我们来聊聊多线程的历史。

简单来说不论什么技术都是来满足人类“惰性”的欲望,多线程也不例外。1960就開始有了多线程的思想。为了便于理解请看一个样例:

小明每天早上6点从起床到去上学6点半须要做下面事情:1起床穿衣 2洗漱 3早餐。4唱歌(不去管为什么要唱歌)。而有一天他6点10分才起床为了不迟到他想到把唱歌这件事在穿衣服的时候能够一起做,这样在同一时间去做两件事就能够缩短时间。

这个样例就能非常好的演示多线程思想的诞生。就是为了提高效率。缩短做事的时间,这就事实上非常好的解答了第2个问题,而一个技术的本身的特性跟它所须要解决的问题是分不开的,能够这么说需求决定了一个技术的特性,什么是多线程?就是并发执行多个线程,而这个问题的关键是又引发了一个问题。那什么又是线程?从上面的小明的样例来看,我们能够确定的是线程一定有两个重要的因素:1任务 2时间
 。小明须要做的每个事情就是一个任务,要完毕这些任务一定有一个时间段(无论这个时间段的长短),我们再来看看官方对线程的定义和组成:

线程,有时被称为轻量级进程(Lightweight Process。LWP),是程序运行流的最小单元。

一个标准的线程由线程ID,当前指令指针(PC)。寄存器集合和堆栈组成。

对于这个定义我并非非常喜欢由于他是从程序的单位大小去说明。相对而言我认为这么说更好些:

线程是指程序的一个指令运行序列!

没错。线程就是多个任务按一定的顺序去排列运行,这就像一个编剧写好了一个剧本(任务)。导演和演员去实现这些剧本的情节,而拍出来的电影就是线程,这里大家有没发现一个非常有趣的本质,电影事实上就是把N个镜头按顺序播放,那剧本和电影有什么本质差别?或者说说任务和线程有什么差别?这个问题非常多人都分不清,就连think
in java的作者也说自己当初常常分不清楚两者的差别,我觉得它们的差别在于:时间。假设没有时间那么任务就没法运行。电影也没法拍摄,要深刻的理解这点非常重要,由于主要的概念理解决定你对技术本身的使用方式。

而后面也解释了线程的组成。这里我简单的说明。在后面我会专门开一片线程组成的深入研究。线程id就像一个人的身份证一样这个就不说了,指令指针就是我们理解的“任务”(这里暂且这么理解)。寄存器集合和堆栈就是拍电影的“场地”。

要回答最后一个问题有一个前提:那就是你会使用线程,在这前提下另一个前提是:你知道什么是线程。所以要回答最后这个问题这将是整个多线程系列终于要回答的问题。

时间: 2024-10-15 19:38:36

多线程之浅谈线程概念的相关文章

浅谈线程池(下):相关试验及注意事项

三个月,整整三个月了,我忽然发现我还有三个月前的一个小系列的文章没有结束,我还欠一个试验!线程池是.NET中的重要组件,几乎所有的异步功能依赖于线程池.之前我们讨论了线程池的作用.独立线程池的存在意义,以及对CLR线程池和IO线程池进行了一定说明.不过这些说明可能有些"抽象",于是我们还是要通过试验来"验证"这些说明.此外,我认为针对某个"猜想"来设计一些试验进行验证是非常重要的能力,如果您这方面的能力略有不足的话,还是尽量加以锻炼并提高吧. C

浅谈线程

在java程序设计语言中,并发程序主要集中于线程,随着越来越多的计算机系统拥有多个处理器或带有多个执行内核,线程的系统能力也得到了极大的增强,多线程编程是提高应用程序性能的重要手段. 刚开始接触线程的概念,是从学习操作系统开始的,把一个用户的一个计算问题或者一个应用问题作为一个进程,把该进程中可以并发执行的各部分分别作为线程,随着学习的深入,慢慢揭开线程的面纱,那么线程的概念是如何定义的?线程又有着怎样的属性和组成?线程的又是怎么工作的?线程和进程又有着怎样千丝万缕的关系?如何定义启动一个线程?

iOS多线程编程——浅谈GCD

GCD对于iOS开发者来说肯定不陌生,他和NSThread,NSOperation一起作为iOS开发中主要的三种多线程实现方法,而GCD是最最底层的,所以对于作为一个iOSer,GCD是必须掌握的. 我通过对于以下两篇文章的阅读,基本上掌握了GCD的基本使用方法.所以首先感谢两位作者. GCD 深入理解:第一部分 iOS多线程开发--GCD的使用与多线程开发浅析(二) 一.基本概念 对于新手来说,最常见同时最容易搞混的的莫过于GCD中的一些基本概念了. 并行与并发(Parallelism &&am

Python的多线程GIL浅谈

来源知乎:https://www.zhihu.com/question/23474039/answer/269526476 在介绍Python中的线程之前,先明确一个问题,Python中的多线程是假的多线程! 为什么这么说,我们先明确一个概念,全局解释器锁(GIL).Python代码的执行由Python虚拟机(解释器)来控制.Python在设计之初就考虑要在主循环中,同时只有一个线程在执行,就像单CPU的系统中运行多个进程那样,内存中可以存放多个程序,但任意时刻,只有一个程序在CPU中运行.同样

Java 并发编程(一)浅谈线程安全

首先我们要弄清楚什么叫线程安全. "线程安全"是指:当多个线程访问某个类时,不管运行环境采用何种调度方式或者这些线程如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的. 这里有三个关键点, 第一."线程安全"问题是来源于多个线程访问的情况下,当个线程没有竞争便涉及到出现线程安全的问题. 第二.类的"线程安全"性不依赖于多线程的执行顺序. 第三.主调代码不需要同步或协同.某个类"

浅谈NAT概念及原理,配置NAT 网络地址转换---PAT端口地址转换;

NAT 网络地址转换理论概况:NAT的概念:它将自动修改IP包头中的源IP地址或目的IP地址.IP地址的校验则在NAT处理过程中自动完成.它是通过内部网络的私网IP地址翻译成全球唯一的公网IP地址,使内部网络可以连接到互联网.NAT的实现方式:1.静态转换(static translation):将内部网络的私有IP地址转换为公用的合法的IP地址.IP地址的对应关系是一对一的.2.动态转换(dynamic translation):内部网络转换为公网时,IP地址的对应关系是不确定的,随机的.3.

近期业务需要所引发的性能优化问题,浅谈线程池性能优化

线程池对于性能优化无处不在 1.楼主在平时产品开发过程中所遇到的性能问题,特别是最近特别流行的微服务架构. web - java - 底层数据源(python亦或者opensatck),对于这种前后台分离的场景 无时无刻会存在对于业务场景需要对同一数据源进行百次,千次的重复调用过程. 性能方面就会出现接口延迟,过慢,超时等情况 下面就楼主最近遇到的一个业务场景加以举例说明:做云计算相关的想必都是知道,我们在为客户提供单板的过程中(也就是物理机):会对众多的单板进行管理,这里我们就引进主机组: 主

Java多线程之 -- 进程和线程

Java多线程之 – 进程和线程 概念 进程 程序的动态执行过程 包括占用的资源(内存.CPU)和线程 线程 线程是程序中最小的执行单位 一个进程有多个线程 线程共享进程的资源 进程和线程的区分 我们可以想象为进程为班级而线程是邦奇中得每一个学生 线程之间的交互 互斥,类似于每一个学生都为了第一名而你争我让,线程也是,都想抢占CPU的资源 同步,当举行运动会的时候,大家都团结一心,彼此共享自己的资源 Thread.Runnable Thread Introduction Thread 是Java

java多线程浅谈

经常看到,一个对象的synchronized方法被一个线程调用后,那么其他线程还能调用该线程的其他方法吗? 网上给出各种答案,其中一种是:不能. 但是,我们有没有自己动手去写一个简单的程序来验证一下?从这个问题浅谈一下我对java多线程的理解. 要理解java的多线程,首先的理解jvm. 参见http://blog.csdn.net/kyfg27_niujin/article/details/7942006