《Java高级程序设计》课件——学习情境6 Java多线程与同步机制.pptx
;一、应用场景
二、线程和多线程的概念
三、线程的定义、创建和启动
四、线程的生命周期、状态及状态之间的转换
五、线程的优先级设置
;3;多线程的常见应用场景:
(1)后台任务,例如:耗时或大量占用处理器的任务,定时向大量(100w以上)的用户发送邮件;
(2)异步处理,例如:发微博、记录日志等;
(3)并发运行,例如:视频解码,音频解码,网络解码等等;
(4)分布式计算,例如:在两个或多个软件间互相共享信息。;二、线程及多线程的概念;多线程(Multithreading):是指从软件或者硬件上实现多个线程并发执行的技术。
并发(Concurrency):一个进程可以由多个线程组成,即在一个进程中可以同时运行多个不同的线程,他们分别执行不同的任务。当进程内的多个线程同时运行时,这种运行方式被称为并发运行。;三、线程的定义、创建和启动;定义一个继承Thread类的子类,并重写该类的run()方法。;定义Runnable接口的实现类,并重写该接口的run()方法。;线程实现了Runnable接口后还可以继承其他的类。
采用继承Thread类,就不能再继承其他类。因为Java只支持单一继承。;3.2线程的创建;首先创建Runnable实现类的实例,再以此实例作为Thread的构造函数里的target参数来创建Thread对象,该Thread对象才是真正的线程对象。;3.3线程的启动;四、线程的生命周期、状态及状态之间的转换;这是线程的生命周期图;在生命周期中有各种各样的状态,这些状态之间也可以相互转换。;线程的状态;一个线程可以在给定时间点处于一个状态。
同一时刻,线程有且仅有其中的一种状态。
RUNNABLE状态包括了操作系统线程状态中的Running和Ready。
这些状态是不反映任何操作系统线程状态的虚拟机状态。;线程状态间的转换;状态的转换如图1-2所示;用new关键字创建一个线程对象后,该线程对象就处于新生状态(NEW)。;线程通过调用start方法进入可运行状态(RUNNABLE)。
处于可运行状态的线程已经具备了运行条件,但还没有分配到CPU,进入线程就绪队列,等待系统为其分配CPU。;处于可运行状态的线程,如果获得了CPU的调度,就会从可运行状态变为运行状态,执行run()方法中的任务。
处于运??状态的线程最为复杂,它可以变为可运行状态、阻塞状态、等待状态、超时等待状态和终止状态。;阻塞状态是线程等待锁的状态。当线程刚进入可运行状态(注意,还没运行),发现将要调用的资源被synchronized(同步),获取不到锁标记,将会立即进入锁池状态
线程从阻塞状态只能进入就绪状态,无法直接进入运行状态。;等待状态;超时等待状态;终止状态;五、线程的优先级设置;线程优先级的设置;Thread类常用方法;小结;;一、任务描述
二、任务分析、设计
三、任务实施
四、运行结果;35;二、任务分析、设计;其类图如图6-1所示。;1.分别使用继承Thread类、实现Runable接口两种方式定义两个线程。
2.在测试主类的main方法中创建两个线程的对象,然后启动,观察结果。
3.通过线程的调度来改变线程的状态,观察结果。
4.使用Thread的getPriority()、setPriority()获取、设置线程的优先级。;三、编码实现;定义杨辉三角形线程PascalTriangleThread;定义斐波那契数列线程FibonacciThread;创建线程,即创建线程类的对象;FibonacciThreadft=newFibonacciThread();
Threadt=newThread(ft);;启动线程;从运行结果上可以看到创建的多个线程是交替执行的,这就体现了线程的并发性。;3.2通过线程的调度查看线程的状态;publicvoidrun(){
//TODOAuto-generatedmethodstub
try{
printFibonacci();
waitForASecond();//在新线程中运行waitForASecond()方法
waitForYears();//在新线程中运行waitForYears()方法
}catch(InterruptedExceptione){
e.printStackTrace();
}
};//1.查看新建线程时的状态
FibonacciThreadf1=newFibonacciThread();
Threadft1=newThread(f1);
System.out.println(新建线程时的状态:+ft1.getSta