Java多线程之基本概念

原创 2016年05月31日 16:21:49

什么是进程(Process)

几乎所有OS都支持进程概念,进程是具有一定独立功能的程序,关于某个数据集合上的一次运行活动,是系统资源分配和调度的一个独立运行单位。

程序是静态的概念,进程是动态的概念。

程序是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体,当一个程序进入内存运行时,就变成进程进程是程序在某个数据集上的执行,是一个动态实体(进程本身不会运行,是线程的容器)

进程因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消,反映了一个程序在一定的数据集上运行的全部动态过程。

若干进程有可能与同一个程序相关系,且每个进程皆可以同步(循序)或不同步(平行)的方式独立运行。进程为现今分时系统的基本运作单位。

一个程序可能对应若干进程,可以是一个程序多次执行.
一个进程可以包含一个或多个线程。
一个进程至少要包含一个线程(一个线程必须有一个父进程)。

进程的三个特征

  • 独立性
    进程是系统中独立存在的实体,有自己独立的资源,私有的地址空间。无进程本身允许,一个用户进程不可以直接访问其他进程的地址空间

  • 动态性
    程序是静态指令集合,进程是正在系统中活动的指令集合。进程加入了时间概念,具有自己的生命周期和各个状态,程序没有。

  • 并发性
    多个进程可以在单个CPU上并发执行,多个进程间不会互相影响,切分时间片

什么是线程(Thread)

从资源调度角度看,我们知道程序执行的过程,伴随着许多次CPU资源、内存资源、硬盘资源、网络资源和其他I/O资源的分配调度。这些硬件资源需要操作系统管理调度,而操作系统能够进行运算调度的最小单位,就是线程。

从程序运行的角度看,一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程

线程本身不能运行,它只能用于程序中。

说明:

  • 线程是程序内的顺序执行流,只能使用分配给程序(进程)的资源和环境,可以有自己堆栈,程序计数器,和局部变量。
  • 由于多个线程共享父进程的全部资源,因此,需确保线程不会妨碍同一进程里的其他线程

并发性(concurrency)与并行性(parallel)

并行:同一时刻,有多条指令在多个处理器上同时执行(多核CPU)
并发:同一时刻,只有一个指令执行,但多个进程指令被快速轮换执行,使得宏观上具有多个进程同时执行的效果(切分时间片)

现代操作系统都支持多进程的并发,具体实现细节上可能因为硬件和操作系统的不同而采用不同的策略,常用:

  • 共用式的多任务操作策略

  • 抢占式多任务操作策略

多线程

多线程之于进程的理解,可以类比多进程之于操作系统。多线程指在单个程序中可以同时运行多个不同的线程执行不同的任务。

线程在程序中是独立、并发的执行流,与分隔的进程相比,进程中线程之间的间隔程度要小。它们共享内存、文件句柄其他每个进程应有的状态。

线程的划分尺度小于进程,使得多线程程序的并发性高。进程在执行过程中有独立的内存单元,多个线程共享这个内存,从而提高了程序的运行效率

线程比进程有更高的性能,

因为同一个进程中的线程有共性: 共享一个进程的虚拟空间,

共享的环境包括: 进程代码段,进程的公有数据等。利用这些共享的数据,线程很容易实现通信。

操作系统创建一个进程时,需要分配独立的内存,并分配大量相关的资源;但创建线程就简单地多,因此,使用多线程实现并发比多进程实现并发要性能高。

总结起来,多线程的优势:

  • 进程间不能共享内存,但线程间共享内存很容易。
  • 创建线程的代价比进程要小得多,使用多线程实现多任务并发效率高
  • Java内置多线程功能支持,不是单纯地作为底层OS的调度方式,简化了多线程编程

Java线程模型

  Java多线程的优点就在于取消了主循环/轮询机制。一个线程可以暂停而不影响程序的其他部分。
  多线程允许活的循环在每一帧间隙中沉睡一秒而不暂停整个系统。

线程组

  所有线程都隶属于一个线程组。那可以是一个默认线程组,也可以是一个创建线程时明确指定的组。
 
  在创建之初,线程被限制到一个组里,而且不能改变到一个不同的组。
  若创建多个线程而不指定一个组,它们就会与创建它的线程属于同一个组。

版权声明:本文为博主原创文章,未经博主允许不得转载。

java 多线程 future 基本原理

/** * Date:2016年9月7日下午7:56:03 * Copyright (c) 2016, www.bwbroad.com All Rights Reserved. * */ p...
  • xuejianxinokok
  • xuejianxinokok
  • 2016年09月12日 22:23
  • 541

多线程之基本概念篇

转载地址:http://www.cnblogs.com/wendingding/p/3806821.html 1.线程与队列 队列可以看作对线程的封装和替代方案,在GCD中,我们面...
  • u011238639
  • u011238639
  • 2016年01月04日 16:46
  • 203

java多线程——线程间通信之线程等待唤醒机制

三个方法 wait() notify() notifyAll() 三个方法都使用在同步中,因为要对持有锁(又叫监控)的线程操作。 所以要使用在同步中,因为只有同步才具有锁。 为什么这些操作线...
  • u011402596
  • u011402596
  • 2015年04月10日 01:16
  • 912

多线程之使用信号量

引言信号量作为GCD的一部分,常用于多线程或任务间协作,当一个任务的执行过程中需要依赖另一个任务时即可使用信号量。实现原理信号量通过信号计数来实现。其使用即计数过程可分为三个部分:创建信号量、等待信号...
  • l964968324
  • l964968324
  • 2015年09月10日 18:56
  • 472

Swift - 多线程实现方式(3) - Grand Central Dispatch(GCD)

1,Swift继续使用Object-C原有的一套线程,包括三种多线程编程技术:(1)NSThread(2)Cocoa NSOperation(NSOperation和NSOperationQueue)...
  • offbye
  • offbye
  • 2016年02月26日 11:24
  • 2432

Java多线程: CAS

悲观锁与乐观锁悲观锁:悲观锁思想认为如果多个线程中使用共享资源,则它们肯定会同时进行修改从而引起冲突,悲观锁的解决方式是共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程。syn...
  • eejron
  • eejron
  • 2016年11月16日 17:38
  • 247

Java多线程之线程协作

无意中在一篇文章中看到一个面试题,题目内容为:现有一个统计任务,需要3个线程完成,在这三个线程完成后由一个线程完成最后的统计报告工作,写出大概代码。 其实多线程问题都可以从两个角度考虑实现,一种是ja...
  • feichenwangyalin
  • feichenwangyalin
  • 2016年03月26日 16:27
  • 965

java多线程之(Exchanger)

Exchanger是自jdk1.5起开始提供的工具套件,一般用于两个工作线程之间交换数据。具体场景如下: 此类提供对外的操作是同步的;用于成对出现的线程之间交换数据;可以视作双向的同步队列;...
  • liangjianyong007
  • liangjianyong007
  • 2016年03月20日 16:14
  • 200

java多线程之(yield)

yield方法会让当前线程交出CPU权限,让CPU去执行其他的线程。它跟sleep方法类似,同样不会释放锁。但是yield不能控制具体的交出CPU的时间, 另外,yield方法只能让拥有相同优先级的线...
  • liangjianyong007
  • liangjianyong007
  • 2016年01月21日 20:34
  • 291

java多线程之优先级

1 java多线程中有优先级。优先级范围在1~10。值越大优先级越高。一般理解为:优先级高的获得cpu的几率更大些。只是几率更大些。其余没别的什么。设置优先级通过setPriority方法。 如:T...
  • yumolan4325
  • yumolan4325
  • 2018年01月25日 09:19
  • 4
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java多线程之基本概念
举报原因:
原因补充:

(最多只允许输入30个字)