JAVA学习--多线程

线程的概念

以往开发的程序大多都是单线程的,即一个程序只有从头到尾的一 条执行路径。 但是在生活中的很多过程都具有多条途径同时工作的。比如,我们可以一边打游戏,一边听音乐。而多线程(Multithread)是指在同一个进程中同时存在几个执行体,按几条不同的执行路径同时工作的情况。所以多线程编程的含义就是可将一个程序任务分成几个可以同时并发执行的子任务。特别是在网络编程中,会发现许多功能是可以并发执行的。

1.程序,进程,多任务与线程

1.1 程序(Program)

程序是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。

1.2 进程(Process)

进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建、运行到消亡的过程。简单地说,一个进程就是个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源,如CPU时间、内存空间、文件、输入输出设备的使用权等等。如每一个正在Windows操作系统上执行的程序,都可以视为一个进程而且每个进程之间是独立的。

进程的概念主要有两点:
1 进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区(text region)存储处理器执行的代码,数据区域(data region存储变量和进程执行期间使用的动态分配的内存,
和堆栈(stack region)存储着活动过程调用的指令和本地变量。
2、进程是一个“执行中的程序”。程序是一个没有生命的实体,进程既是基本的分配单元,也是基本的执行单元。 进程是多道程序系统出现后, 为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。

1.3 多任务(Multi task)

多任务是指在一个系统中可以同时运行多个进程,即有多个独立运行的任务,每一个任务对应一个进程。每个进程都有段专用的内存区域. 即使是多次启动同段程序产生不同的进程也是如此。而同时运行的进程,其实是指由操作系统将系统资源分配给各个进程,每个进程在CPU上交替运行。每个进程占有不同的内存空间,内存消耗很大,这使系统在不同的程序之间切换时开销很大,进程之间的通信速度很慢。

1.4 线程(Thread)

进程中所包含的一个或多个执行单元称为线程(thread)。一个线程就是进程中的一个顺序执行流。进程拥有一个私有的虚拟地址空间,该空间仅能被它所包含的线程访问。即同一个进程中的多个线程共享一块内存空间和一组系统资源。线程只能归属于一个进程并且它只能访问该进程所拥有的资源。线程本身也有一个供程序执行时的堆栈,在线程切换时,负荷小,因此线程也被称之为轻负荷进程。通俗点说:应用程序中的每一个任务执行流,就是线程。
而多线程就是同时执行一个以上的线程,一个线程的执行不必等另一个线程执行完后才执行,所有线程都可以发生在同一时刻。但操作系统并没有将多个线程看成多个独立的应用去实现线程的调度和管理以及资源分配。

1.5 进程与线程的区别

它们之间的概念很容易混淆,区别有以下几点:
(1)进程是操作系统运行的一个任务,线程是进程中运行的一个任务
(2)进程是资源分配的最小单位(相互独立),线程是程序执行的最小单位(cpu调度的基本单元)。
(3)进程有自己的独立地址空间,每启动一个进程,系 统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。进程之间的通信需要以IPC进行
(4)线程是轻量级的进程,同一个进程中可以包含多个线程。多线程共享进程中的数据,使用相同的地址空间, 因此,线程之间的通信更方便,CPU切换(或创建)一个线程的开销远比进程要小很多。
(5)一个进程结束,其内的所有线程都结束,但不会对另外一个进程造成影响。多线程程序,一个线程结束,有可能会造成其他线程结束不过如何处理好同步与互斥是编写多线程程序的难点。

2.并发原理

多个线程“同时运行”只是我们感官上的一种表现。其实,线程是并发运行的。操作系统将时间划分成很多时间片段, 尽可能的均匀分配给每一个线程,获取时间片段的线程被 CPU运行,而其他线程处于等待状态。所以这种微观上是断断续续的,宏观上都在运行的现象叫并发。 但不是绝对意义上的“同时发生”。

线程的状态和生命周期

新建线程在它的一个完整的生命周期内通常要经历五种状态,通过线程的控制与调度可以使线程在这几种状态之间转化。
在这里插入图片描述

1.新建状态(newborn)

新声明并创建了一个线程对象,但还未被执行。此时线程对象已经被分配了内存空间和其他资源,并已经被初始化。

2.就绪状态(runnable)

就绪状态也称为可运行状态。处于新建状态的线程被启动后,将进入线程队列排队等待CPU时间片,此时它具备了运行的条件,也就是处于就绪状态。

3.运行状态(running)

当就绪状态的线程被调度并获得CPU资源时,便进入运行状态,该状态表示线程正在运行并已经拥有了对CPU的控制权。
处于运行状态的线程在下列情况下会让出CPU的控制权:
(1)线程运行完毕。
(2)有比当前线程优先级更高的线程处于就绪状态。
(3)线程主动睡眠一段时间
(4)线程在等待某一资源。

4.阻塞状态(blocked)

阻塞状态是一个正在执行的线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。
阻塞的情况分三种:
(1)等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
(2)同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
(3)其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

5.消亡状态(dead)

处于消亡状态的线程不在具有继续运行的能力。导致消亡的原因有两个:一是执行完了run()方法,二是因故停止运行。当线程处于消亡状态,并且没有改线程对象的引用是,垃圾回收器会从内存中删除该线程对象。

线程的优先级和调度

优先级

在多线程系统中,每个线程都被赋予一个执行优先级。优先级决定了线程被CPU执行的优先顺序。优先级高的线程可以在一段时间内获得 比优先级低的线程更多的执行时间,这样效率会更高。如果线程的优先级完全相等,就按照“先来先用”的原则进行调度。
Java语言中线程的优先级从低到高以整数1~10表示,共分为10级。Thread类有3个关于线程优先级的静态变量,MIN-PRIORITY表示最小优先级,通常为1; MAX -PRIORITY表示最高优先级,通常为10; NORM-PRIORITY表示普通优先级,默认值为5。
对应一个新建的线程,系统会遵循如下的原则为其指定优先级:
(1)新建线程将继承创建它的父线程的优先级。父线程是指执行创建新线程对象语句所在的线程,它可能是程序的主线程,也可能是某一个用户自定义的线程。
(2)一般情况下, 主线程具有普通优先级。如果要想改变线程的优先级,可以通过调用线程对象的setPriority()方法来进设置。

public class ThreadDemo05 {
   
	public static void main(String[] args) {
   
		Thread t1 = new Thread(
				new Runnable() 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值