文档详情

Java高级编程-线程.ppt

发布:2018-05-02约1.98万字共107页下载文档
文本预览下载声明
第9章 线程 ;图 8.2-1; 实现多任务通常有两种方法,一种称为抢占式多任务(preemptive multitasking);一种叫合作式多任务(cooperative multitasking)。对于抢占式多任务,操作系统自行决定何时中断一个程序,将执行时间分给其他程序。相反,对于合作式多任务操作系统将与程序进行协商,只有程序自愿放弃控制时才被中断。虽然抢占式多任务实现起来困难一些,但却有效得多。对于合作式多任务来说,一个运行不好的程序会占有整个系统。 ; 多线程把操作系统的多任务原理应用到程序中,进一步发展了这一原理。应用了多线程技术的程序如同多任务操作系统一样,可以同时执行多个任务。每个任务被称为一个线程——它是线程控制流的简称。实际上,多线程的应用非常广泛,例如,浏览器在下载数据的同时还可以浏览其他网页,或者当某个网页下载太慢时,还可以控制浏览器中止这个网页浏览。Java语言本身也使用一个线程在后台收集无用的内存单元——这样就减少了用户管理内存的麻烦!; 通常,我们把操作系统的多个任务称为进程(Process),而程序中的多任务则称为线程。那么,线程和进程之间有什么区别呢?最基本的区别就是每个进程都拥有一组完整的属于自己的变量,而线程则共享这些数据。看起来这样似乎不如进程安全,确实如此,本章后面将会更详细地讨论。但线程的优势在于创建和注销线程的开销比运行新的进程少得多,所以现在主流的操作系统都支持多线程。而且,和进程间的通信相比,线程间的通信要快得多,也方便得多。 ;多线程基本概念;多线程基本概念;多线程基本概念;线程的创建与控制;继承Thread;public class ThreadTest { public static void main(String args[]) { Xyz r = new Xyz(); Thread t = new Thread(r); t.start(); } } class Xyz implements Runnable { int i; public void run() { while (true) { System.out.println(Hello + i++); if (i == 50) break; } } };线程的创建与控制;线程的创建与控制;线程的创建与控制;线程的状态 线程有四种状态,分别为 ● new(初始态):一个线程在调用new()方法之后,调用start()方法之前所处的状态。在初始态中,可以调用start()和stop()方法。 ; ● Runnable(可运行状态):一旦线程调用了start()方法,线程就转到Runnable()状态。注意,如果线程处于Runnable状态,它也有可能不在运行,这是因为还存在优先级和调度问题。 ● blocked(阻塞/挂起状态):线程处于阻塞状态。这是由两种可能性造成的:因挂起而暂停;由于某些原因而阻塞,例如等待IO请求的完成等。 ● dead(终止状态):线程转到退出状态。这有两种可能性:run()方法执行结束;调用了stop()方法。; 一个Thread对象在它的生命周期中会处于各种不同的状态。图8.2-2形象地说明了这点。 尽管线程变为可运行的,但它并不立即开始运行。在一个只带有一个处理机的机器上,某一个时刻只能进行一个动作。在Java中,线程是抢占式的,但并不一定是分时的 (一个常见的概念错误是认为“抢占式”只不过是“分时”的一种别称而已)。抢占式调度模型是指可能有多个线程是可运行的,但只有一个线程在实际运行。 ; 这个线程会一直运行,直至它不再是可运行的,或者另一个具有更高优先级的线程成为可运行的。对于后面一种情形,则是因低优先级线程被高优先级线程抢占了运行的机会。 ? 一个线程可能因为各种原因而不再是可运行的:线程的代码可能执行了一个Thread.sleep()调用,要求这个线程暂停一段固定的时间;这个线程可能在等待访问某个资源,而且在这个资源可访问之前,这个线程无法继续运行。 ;图 8.2-2 ; 所有可运行线程根据优先级保存在池中。当一个被阻塞的线程变成可运行时,它会被放回相应的可运行池。优先级最高的非空池中的线程会得到处理机时间(被运行)。
显示全部
相似文档