第11章11章多线程
陈国君
通过本章的
学习,主要掌握以下知识点:通过本章的学习,主要掌握以下知识点:
程序、进程、线程、程序、进程、线程、多任务的概念线程的状态与生命周期Thread线程类与Runnable接口线程类与RunnableThread线程类与Runnable接口本章的重点:本章的重点:利用Thread类的子类来创建线程利用类的子类来创建线程用Runnable接口来创建线程接口来创建线程本章的难点:本章的难点:线程的同步机制
11.1线程的概念
程序、进程、线程、11.1.1程序、进程、线程、多任务
程序(Program):含有指令和数据的文件,程序(Program):含有指令和数据的文件,被(Program)存储在磁盘或其他的数据存储设备中,也就是说程存储在磁盘或其他的数据存储设备中,序是静态的代码。序是静态的代码。进程(Process):程序的一次执行过程,进程(Process):程序的一次执行过程,是系(Process)统运行程序的基本单位,因此进程是动态的。统运行程序的基本单位,因此进程是动态的。
多任务(Multitask):是指在一个
系统中多任务(Multitask):可以同时运行多个程序,可以同时运行多个程序,即有多个独立运行的任务,每一个任务对应一个进程。任务,每一个任务对应一个进程。线程(Thread)也是一个执行中的程序,线程(Thread):也是一个执行中的程序,但线程是一个比进程更小的执行单位。但线程是一个比进程更小的执行单位。一个进程在其执行过程中可以产生多个线程,程在其执行过程中可以产生多个线程,形成多条执行线路。条执行线路。
多线程就是同时执行一个以上的线程,多线程就是同时执行一个以上的线程,一个线程的执行不必等待另一个线程执行完才执行,完才执行,所有的线程都可能发生在同一时刻。时刻。
11.1.2线程的状态与生命周期
新建线程在它的一个完整的生命周期内通常要经历五种状态。要经历五种状态。通过线程的控制与调度可使线程在这几种状态间转化,如图11.1所示。程在这几种状态间转化,如图11.1所示。11.1所示
新建状态Newbornstart()就绪状态Runnable时间片到yield()sleep时间到interrupt()获得互斥使用权其它阻塞Blocked互斥阻塞Blockedsleep()join()wait()synchronized()notify()等待阻塞Blocked调度运行状态Runningrun()结束消亡状态Dead
Interrupt()
图11.1线程的生命周期与线程的状态
1.新建状态(Newborn)。新建状态(Newborn)2.就绪状态(Runnable)。就绪状态(Runnable)3.运行状态(Running)。运行状态(Running)。(Running)4.阻塞状态(Blocked)。阻塞状态(Blocked)。(Blocked)5.消亡状态(Dead)消亡状态(Dead)
11.1.3线程的调度与优先级
调度:指在各个线程之间分配CPU资源。调度:指在各个线程之间分配CPU资源。CPU资源优先级:在多线程系统中,每个线程都优先级:在多线程系统中,被赋予一个执行优先级。优先级决定了线程被赋予一个执行优先级。被CPU执行的优先顺序。CPU执行的优先顺序。执行的优先顺序
Java的Thread线程类与Runnable接口线程类与Runnable11.2Java的Thread线程类与Runnable接口
Java中实现多线程的方法有两种,Java中实现多线程的方法有两种,一种是继中实现多线程的方法有两种承java.lang包中的Thread类,二是用户在定义自java.lang包中的Thread类包中的Thread己的类中实现Runnable接口。己的类中实现Runnable接口。Runnable接口
利用ThreadThread类的子类来创建线程11.2.1利用Thread类的子类来创建线程
Java程序语言中的基本类库中已定义了Java程序语言中的基本类库中已定义了Thread这个基本类,内置了一组方法,Thread这个基本类,内置了一组方法,使程序利用这个基本类该类提供的方法,去产生一个新的线程、执行一个该类提供的方法,去产生一个新的线程、线程、终止一个线程的
工作,线程、终止一个线程的工作,或是查看线程的执行状态。状态。应用见教材例11.1。应用见教材例11.1。11.1
Runnable接口来创建线程11.2.2用Runnable接口来创建线程
Runnable接口是定义在java.lang包中的一个Runnable接口是定义在java.lang包中的一个接口是定义在java.lang接口,其中只提供了一个抽象方法run()的声明。接口,其中只提供了一个抽象方法run()的声明。run()的声明Runnable接口只有一个方法run(),用户可以Runnable接口只有一个方法run(),接口只有一个方法run()声明一个类并实现Runnable接口,并定义run()方声明一个类并实现Runnable接口,并定义run()方Runnable接口run()法,将线程代码写入其中,就完成了这一部分的任将线程代码写入其中,务。