java 核心编程——线程之线程的基本概念(一)
1.进程
定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
进程的概念主要有两点:
第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。
第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。
2.线程
线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。
3.适用范围 3.1.服务器中的文件管理或通信控制 3.2.前后台处理 3.3.异步处理
4.线程特点
1)轻型实体
2)独立调度和分派的基本单位。
3)可并发执行。
4)共享进程资源。
5.线程和进程的区别
1)地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
2)通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
3)调度和切换:线程上下文切换比进程上下文切换要快得多。
4)在多线程OS中,进程不是一个可执行的实体。
6.守护线程
守护线程是特殊的线程,一般用于在后台为其他线程提供服务.
Java中,isDaemon():判断一个线程是否为守护线程. Java中,setDaemon():设置一个线程为守护线程.
7.线程概念模型
(1)分时:cpu将程序执行的时间分片,为每个任务分配时间片,时间片结束轮询下一个时间片的代码并执行。从微观上看,多任务的执行是串联的,但是从宏观来看却是多任务并发执行。
(2)多任务:程序可以一次运行多个任务,每个任务对应一个线程。
8.线程运行状态
如图;
线程的状态表示线程正在进行的活动以及在此时间段内线程可以完成的任务。
●新线程态(New Thread) 产生一个Thread对象就生成一个新线程。当线程处于"新线程"状态时,仅仅是一个空线程对象,它还没有分配到系统资源。因此只能启动或终止它。任何其他操作都会引发异常。例如,一个线程调用了new方法之后,并在调用start方法之前的处于新线程状态,可以调用start和stop方法。 ●可运行态(Runnable) start()方法产生运行线程所必须的资源,调度线程执行,并且调用线程的run()方法。在这时线程处于可运行态。该状态不称为运行态是因为这时的线程并不总是一直占用处理机。特别是对于只有一个处理机的PC而言,任何时刻只能有一个处于可运行态的线程占用处理 机。Java通过调度来实现多线程对处理机的共享。注意,如果线程处于Runnable状态,它也有可能不在运行,这是因为还有优先级和调度问题。 ●阻塞/非运行态(Not Runnable) 当以下事件发生时,线程进入非运行态。 ①suspend()方法被调用; ②sleep()方法被调用; ③线程使用wait()来等待条件变量; ④线程处于I/O请求的等待。 ●死亡态(Dead) 当run()方法返回,或别的线程调用stop()方法,线程进入死亡态。通常Applet使用它的stop()方法来终止它产生的所有线程。
9.线程优先级
虽然我们说线程是并发运行的。然而事实常常并非如此。正如前面谈到的,当系统中只有一个CPU时,以某种顺序在单CPU情况下执行多线程被称为调度(scheduling)。Java采用的是一种简单、固定的调度法,即固定优先级调度。这种算法是根据处于可运行态线程的相对优先级来实行调度。当线程产生时,它继承原线程的优先级。在需要时可对优先级进行修改。在任何时刻,如果有多条线程等待运行,系统选择优先级最高的可运行线程运行。只有当它停止、自动放弃、或由于某种原因成为非运行态低优先级的线程才能运行。如果两个线程具有相同的优先级,它们将被交替地运行。 Java实时系统的线程调度算法还是强制性的,在任何时刻,如果一个比其他线程优先级都高的线程的状态变为可运行态,实时系统将选择该线程来运行。一个应用程序可以通过使用线程中的方法setPriority(int),来设置线程的优先级大小。
有线程进入了就绪状态,需要有线程调度程序来决定何时执行,根据优先级来调度。
线程中的join()可以用来邀请其他线程先执行。