线程

线程和进程

梦想的初衷 提交于 2020-03-17 18:35:47
进程 (process)和 线程 (thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。 最近,我读到一篇 材料 ,发现有一个很好的类比,可以把它们解释地清晰易懂。 1. 计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。 2. 假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。 3. 进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。 4. 一个车间里,可以有很多工人。他们协同完成一个任务。 5. 线程就好比车间里的工人。一个进程可以包括多个线程。 6. 车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。 7. 可是,每间房间的大小不同,有些房间最多只能容纳一个人,比如厕所。里面有人的时候,其他人就不能进去了。这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。 8. 一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫 "互斥锁" (Mutual exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域。

JVM实现线程

十年热恋 提交于 2020-03-17 18:35:23
实现线程主要有三种方式:使用内核线程实现,使用用户线程实现和使用用户线程加轻量级进程混合实现。 使用内核线程实现 内核线程(KLT,Kernel-Level Thread),直接由操作系统内核(Kernel,即内核)支持的线程。由内核来完成线程切换,内核通过操纵调度器(Scheduler)对线程进行调度,并负责将线程的任务映射到各个处理器上。每个内核线程可以视为内核的一个分身,这样操作系统就有能力同时处理多件事情,支持多线程的内核叫做多线程内核。 程序一般不会去直接使用内核线程,而是去使用内核线程的一种高级接口——轻量级进程(LWP),即通常意义上的线程*。由于每个轻量级进程都由一个内核线程支持,因此只有先支持内核线程,才能有轻量级进程。*轻量级进程与内核线程之间1:1关系称为一对一的线程模型。 内核线程保证了每个轻量级进程都成为一个独立的调度单元,即时有一个轻量级进程在系统调用中阻塞了,也不会影响整个进程的继续工作。 局限:基于内核线程实现,因此各线程操作等需要系统调用,系统调用代价高,需要在用户态和内核态来回切换,其次,每个轻量级进程都需要一个内核线程的支持,因此轻量级进程要消耗一定的内核资源,如内核线程的栈空间,因此一个系统支持轻量级进程的数量是有限的。 使用用户线程实现 广义上,内核线程以外,就是用户线程。轻量级也算用户线程,但轻量级进程的实现始终是建立在内核上的

进程和线程

隐身守侯 提交于 2020-03-17 18:34:25
转载: 进程 (process)和 线程 (thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。 最近,我读到一篇 材料 ,发现有一个很好的类比,可以把它们解释地清晰易懂。 1. 计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。 2. 假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。 3. 进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。 4. 一个车间里,可以有很多工人。他们协同完成一个任务。 5. 线程就好比车间里的工人。一个进程可以包括多个线程。 6. 车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。 7. 可是,每间房间的大小不同,有些房间最多只能容纳一个人,比如厕所。里面有人的时候,其他人就不能进去了。这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。 8. 一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫 "互斥锁" (Mutual exclusion,缩写 Mutex)

java用Thread方式创建多线程

ぐ巨炮叔叔 提交于 2020-03-17 18:19:48
进程:一个正在执行的程序,每一个进程都有一个执行顺序,该 顺序是一个执行路径,或者叫一个控制单元。 线程:进程中一个独立的控制单元。线程控制着进程的执行。 一个进程中至少有一个线程。 java VM中至少有一个线程负责java程序的执行。 而且这个线程运行的代码存在于main方法中。该线程为主线程。 扩展,jvm启动了两个线程,一个主线程,一个垃圾回收机制的线程。 1.怎样创建一个多线程? 第一种方法:通过继承Thread类的方法 1.继承Thread类 2.重写Thread类的run()方法 目的:将自定义的代码存储在run()方法中,让线程运行。 3.调用线程的start()方法。 (了解:多核编程,单核cpu的时候多线程的切换由线程控制,多核cpu下 则每个cpu可以同时处理多线程,单个cpu在同一时间只能执行一个线程, 多核下内存是瓶颈) 多线程具有随机性: 因为多线程都获取cpu的执行权。cpu执行到谁,谁就执行。明确一点,在某一时刻 只能有一个程序在运行。(多核除外),cpu在做着快速的切换,以达到看上去是同 事运行的效果。至于每个线程执行多久,cpu说了算,(其实我们可以控制执行时间爱你) 为什么要覆盖run()方法? Thread类用于描述线程。该类定义了一个功能,用于存储线程要运行的代码。该存储功能就是run方法。 也就是说Thread类中的run(

JavaScript 进阶(一)JS的\"多线程\"

二次信任 提交于 2020-03-17 17:39:38
这个系列的文章名为“JavaScript 进阶”,内容涉及JS中容易忽略但是很有用的,偏JS底层的,以及复杂项目中的JS的实践。主要来源于我几年的开发过程中遇到的问题。小弟第一次写博客,写的不好的地方请诸位斧正,觉得还有一些阅读价值的请帮忙分享下。这个“JavaScript 进阶”是一个系列文章,请大家鼓励鼓励,我尽快更新。另外,如果你有比较好的话题,也可以在下面评论,我们一起研究提高。 JS是多线程的吗? 多线程编程相信大家都很熟悉,比如在界面开发中,如果一个事件的响应需要较长时间,那么一般做法就是把事件处理程序写在另外一个线程中,在处理过程中,在界面上面显示类似进度条的元素。这样界面就不会卡住,并且能够显示任务执行进度。记得刚开始做前端的时候,老板交代在界面上面做一个定时器,每秒更新用户的在线时间。当时拥有Java和C++开发经验的我自信满满的说我加一个线程就可以分分钟搞定了。所以查阅文档,发现setTimeout和setInterval可以很方便的实现该功能。那时候我就认为这就是JS中的多线程。setTimeout相当于启动一个线程,等待一段时间后执行函数,setInterval则是在另外的一个线程中,每隔一段时间执行函数。这个观念在我的头脑中存在了一年左右,直到遇到了这样的一个问题。 测试人员发现一个按钮的点击响应时间较长,在响应过程中,界面卡住了

线程和进程

假装没事ソ 提交于 2020-03-17 17:38:10
归纳起来可以说:操作系统可以同时执行多个任务,每个任务就是进程;进程可以同时执行多个任务,每个任务就是线程。 几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行中的程序就是一个进程。当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程。   进程(Process)的三个特征:   1、独立性:进程是系统中独立存在的实体,它可以拥有自己独立的资源,每一个进程都拥有自己的私有地址空间。在没有经过进程本身允许的情况下,一个用户进程不能直接访问其他进程的地址空间。   2、动态性:进程和程序的区别在于,程序只是一个静止的指令集合,而进程是一个正在系统中活动的指令集合。在进程中加入了时间的概念。进程具有自己的生命周期和各种不同的状态,这些概念在程序中都是不具备的。   3、并发性:多个进程可以在单个处理器上并发执行,多个进程之间不会互相影响。 并发性(concurrency)和并行性(parallel)是两个概念,并行只在同一时刻,有多条指令在多个处理器上同时执行;并发指在同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行,使得在宏观上具有多个进程同时执行的效果。   多线程扩展了多进程的概念,使得同一个进程可以同时并发处理多个任务。线程(Thread)也被称作轻量级进程(Lightweight Process),线程是进程的执行单元

JAVA中的多线程(一)

馋奶兔 提交于 2020-03-17 17:26:30
进程:是一个正在执行中的程序     每一个进程执行都有一个执行的顺序,该顺序是一个执行路径,或者叫控制单元 线程:就是进程中的一个独立的控制单元     线程在控制着进程的执行 一个进程中至少有一个线程 JAVA VM启动的时候会有一个进程java.exe 该进程中至少有一个线程在负责java程序的执行 而且这个线程运行的代码存在于main方法中 该线程称之为主线程 扩展:更细节说明JVM,JVM的启动不止一个线程,还有负责垃圾回收机制的线程 如何在自定义的代码中,自定义一个线程? 创建线程的第一种方式:   继承Thread,步骤如下     继承Thread类     复写Thread类中的run方法     调用线程的start方法,该方法有两个作用,一个是启动线程,第二个调用run方法 发现运行结果每一次都不同 因为多个线程都获取CPU的执行权,CPU执行到谁,谁就运行 明确一点,在某个时刻,只有一个程序在运行(一个线程),多核除外 CPU做快速的切换,达到看上去是同时运行的结果 我们可以形象把多线程的运行行为看成在互相抢夺CPU的执行权 这就是多线程的一个特性:随机性。谁抢到谁执行,至于执行多长,CPU说了算 1 class Demo extends Thread 2 { 3 public void run() 4 { 5 for(int x = 0; x<60 ;x+

Java 多线程

╄→гoц情女王★ 提交于 2020-03-17 17:22:46
一、概述 理解多线程先要理解线程,理解线程先要理解进程。 1. 进程 一个正在执行的程序。 每个进程的执行都有一个执行的顺序,顺序是一个执行路径,也叫一个控制单元。 2. 线程 进程中独立的控制单元称为线程。 线程控制进程的执行。 进程中只要有一个线程在执行,进程就不会结束。 一个进程中至少存在一个线程。 3. 多线程 Java 虚拟机启动时,会有一个 java.exe 的执行程序,也就是一个进程。 这个进程中至少存在一个线程负责 java 程序的执行,这个线程的运行代码存在 main 方法中,这个线程称之为主线程。 JVM 启动时除了执行一个主线程,还会启动负责垃圾回收机制的线程。 在一个进程中有多个线程执行的方式,称为多线程。 4. 多线程的意义 多线程能让程序产生同时运行的效果,可以提高程序执行的效率。 例如: java.exe 进程执行主程序时,如果程序的代码非常多,在堆内存中会产生很多对象,而对象调用完后就会变成垃圾。如果垃圾过多的话,可能会导致堆内存出现内存不足的现象,影响程序的运行。这种情况下,如果只有一个线程在运行处理的话,程序执行的效率非常低;如果有多个线程在帮助处理的话,程序执行的效率将大大的提高。 例如:垃圾回收机制的线程在帮助进行垃圾回收的话,那堆内存空间的释放将快很多。 5. CPU 运行的原理 PC 上有很多程序“同时”进行,看起来好像是 CPU “同时

Android的Handler,Message,Looper的原理详解

狂风中的少年 提交于 2020-03-17 16:46:20
某厂面试归来,发现自己落伍了!>>> 先说说Looper类:Looper就是为每一个线程创建一个Looper对象,维护一个MessageQueue,并循环从MessageQueue中取出消息并分发给Handler执行。下面是Looper源码中如何使用的一个示例 class LooperThread extends Thread { * public Handler mHandler; * * public void run() { * Looper.prepare(); * * mHandler = new Handler() { * public void handleMessage(Message msg) { * // process incoming messages here * } * }; * * Looper.loop(); * } * } 我们看看Looper.prepare干了些什么事 public static void prepare() { prepare(true); } //判断当前线程是否有Looper对象,没有则new一个并放到ThreadLocal中 private static void prepare(boolean quitAllowed) { if (sThreadLocal.get() != null) { throw new

JVM性能优化概念

╄→尐↘猪︶ㄣ 提交于 2020-03-17 15:34:25
Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress引用类型包括:类类型,接口类型和数组。堆与栈 堆和栈是程序运行的关键,很有必要把他们的关系说清楚。 栈是运行时的单位,而堆是存储的单位。 栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;堆解决的是数据存储的问题,即数据怎么放、放在哪儿。 在Java中一个线程就会相应有一个线程栈与之对应,这点很容易理解,因为不同的线程执行逻辑有所不同,因此需要一个独立的线程栈。而堆则是所有线程共享的。栈因为是运行单位,因此里面存储的信息都是跟当前线程(或程序)相关信息的。包括局部变量、程序运行状态、方法返回值等等;而堆只负责存储对象信息。 为什么要把堆和栈区分出来呢?栈中不是也可以存储数据吗? 第一,从软件设计的角度看,栈代表了处理逻辑,而堆代表了数据。这样分开,使得处理逻辑更为清晰。分而治之的思想。这种隔离、模块化的思想在软件设计的方方面面都有体现。 第二,堆与栈的分离,使得堆中的内容可以被多个栈共享