Java多线程技术初识——7. 线程的生命周期,优先级,调度

来源:互联网 发布:曼联 门萨 fm2016数据 编辑:程序博客网 时间:2024/06/08 19:46

早些日子以前接触了,Java的多线程技术!那时候的学习,主要是在网上下载,各种教学视频,跟着视频学习,后来,发现,跟着视频学习,有个瓶颈——知识并不是很系统!于是,就决定买书,读书来学习,用的是——《Java How  To Program》。感觉,这本书,特别不错!

Java的多线程技术——使Java语言具有比C 和 C++ 语言更加强大的功能,C和C++ 均为单线程语言【C和C++实现多线程——使用系统特定的代码库可以执行多线程】。

这种技术,可以是程序“貌似”在同一时间内可以执行很多任务。

Java多线程是依赖于平台的。因此,多线程应用程序在不同的Java平台上的表现也不同。

关于,Java多线程的创建再次不在赘述,在上一篇中已经详细的论述!可以参见《多线程——》

下面,着重谈谈:

1. Thread类的方法;

2. 线程的生命周期;

3.线程的优先级;

4. 线程的调度;

————————————————————————————————

1. Thread类的方法:


a,public Thread(String threadName) 用于构造一个名为 threadName 的Thread对象。


b, public Thread() 

c, run() —— 线程中真正起作用的语句放在run()的方法体内。该方法可以在 Thread 的子类中覆盖或在Runnable对象中覆盖。

d, start() —— 程序通过调用线程的start()方法执行线程,而start() 则调用run 方法。

当start方法启动后,它便立即返回到其调用者。调用者与这一线程并发执行。

如果start方法试图启动一个已经执行的线程,那么它便会抛出IllegalThreadStateException异常。

e, sleep(long) —— 他的一个参数指出当前执行的线程应休眠多长时间(单位:ms);

f, interrupt()—— 用于中断一个线程。

g, interrupted() —— 如果线程已经被中断,interrupted() 便返回true,否则返回 false。

h, isInterrupted() —— 程序调用它来确定该线程是否被中断。

i, isAlive() —— 如果已经调用了某个线程的start方法,而且该线程没有死亡,那么isAlive方法便返回 true。

j, setName() —— 用于设置线程的名称。

k, getName() —— 用于返回线程的名称。

l, toString() —— 返回一个包含线程名称,线程优先级和线程所属线程组的字符串。

m, currentThread() —— 返回一个对当前Thread的引用。


2. 线程的生命周期:


出生:新创建的线程处于 出生 born状态,在调用线程的start方法之前,该线程一直处于出生状态;
就绪:当调用start方法后,线程便进入了 就绪状态 ready。
运行:当系统给线程分配处理器资源时,处于就绪状态的最高优先级线程便进入了运行状态。running
死亡:当线程的run 方法结束或抛出一个未捕获的异常,那么线程便进入死亡状态。
阻塞:如果处于运行状态的线程发出 I/O请求,它便进入阻塞状态。 blocked。当其等待的I/O操作结束时,阻塞的线程便回到就绪状态。
等待:当处于运行状态的线程调用wait方法时,线程便进入等待状态。它将按次序排在等待队列中,队列中的线程均是由于某个对象调用了wait方法才进入等待状态的
 当与某对象相关的另一个线程调用了notify方法时,那么等待该特定对象的一个线程便进入就绪状态。
 当与某对象相关的一个线程调用了notifyAll方法后,等待该对象的所有线程都回到就绪状态。
休眠: 当程序调用一个正在运行的线程的sleep 方法时,该线程便会进入休眠状态。

3. 线程的优先级

每个Java线程的优先级都在 Thread.MIN_PRIORITY ——1
  Thread.MAX_PRIORITY —— 10
范围内。
默认时,每个线程的优先级都设置为 Thread.NORM_PRIORITY —— 5 ;每个新产生的线程均继承父线程的优先级。

4. 线程的调度

有些Java平台支持时间片技术,有些不支持。
a. 不采用时间片技术时,具有相同优先级的每个线程占有处理器直至任务结束,而其他线程只有等待。
采用时间片技术的系统中,每个线程均获得称为时限的一小段处理器时间,在这段时间内线程可以运行。当时间用完时,即使线程没有结束运行也必须暂停,
os将让处理器执行下一个有相同优先级的线程。
b. Java 调度程序的任务是使最高优先级的线程能始终运行,一旦时间片可用,则使具有同等优先级的线程以轮转的方式顺序使用时间片。 
上图中:
线程A和B以轮转的方式顺序占用时间片,直至两个线程都结束。接着线程C也运行结束。
然后,线程D,E和F按轮转的方式顺序占用时间片,直至他们都结束运行。
这个过程一直延续下去,直至所有线程全部结束。


Notice: 新产生的较高优先级线程可以延迟较低优先级的执行(可能无限延迟下去),这种无限延迟被称为——饥饿!



原创粉丝点击