清华大学java课程课件lesson_7
第七讲线程和Applet
1
线程
2
课前思考
1.如何让程序在运行的过程中,实现多个程
序段的同时运行?序段的同时行
3
学习目标
学习java 中线程的使用中线程的使用,,掌握线程的调
度和控制方法,,清楚地理解多线程的互斥度和控制方法清楚地解多线程的斥
和同步的实现原理和同步的实现原理,,以及多线程的应用以及多线程的应用。。
4
学习指南
掌握线程之间的相互调度关系掌握线程之间的相互调度关系,
,尤其是
通过线程睡眠来使其它线程获得执行机会通过线程眠来使其它线程获得执行机会
的机制的机制,,以及互斥和同步的实现机制以及互斥和同步的实现机制。。
5
难点和重点
1.
多线程的调度和控制
22.多线程的互斥和同步
6
个线程是个程序内部的顺序控制流●
一个线程是一个程序内部的顺序控制流。
●线程和进程
●每个进程都有独立的代码和数据空间(进程上下文),进程切换的开销大。
●线程:轻量的进程,同一类线程共享代码和数据空间每个线程有独立的运行栈和程序计数据空间,每个线程有独立的运行栈和程序计数
器(PC),线程切换的开销小。
多进程在操作系统中能同时运行多个任务●多进程:在操作系统中,能同时运行多个任务
(程序)。
多线程在同应用程序中有多个顺序流同
●多线程:在同一应用程序中,有多个顺序流同时执行。
7
线程的概念模型
封装在java lang Thread 类中●
虚拟的CPU ,封装在https://www.360docs.net/doc/1b10221701.html,ng.Thread 类中。
●CPU 所执行的代码,传递给Thread 类。
●CPU 所处理的数据,传递给Thread 类。
8
线程体
●
java 的线程是通过https://www.360docs.net/doc/1b10221701.html,ng.Thread 类来实现的。
实现的
●每个线程都是通过某个特定Thread 对象run()来完成其操作的方法run()的方法run( )来完成其操作的,方法run( )
称为线程体。
9
线程的状态
):线程对象已经创建●
创建状态(new ):线程对象已经创建,
但尚未启动,所以不可运行。
所有资源都准●可运行状态(runnable):所有资源都准
备好,就差CPU 资源,一旦线程调度器分资源给该线程立刻开始执行配CPU 资源给该线程,立刻开始执行。
●死亡状态(dead ):线程体执行完毕,
即run( )方法运行结束。
●堵塞状态(blocked ):不仅缺乏CPU 资
源,还缺乏其他资源
10
线程的状态
yield( )
new Thread Runnable Dead
start( )run( )运行结束
Blocked
11
(Th d)
●创建状态(new Thread)
Thread myThread = new MyThreadClass( );
(注意:MyThreadClass 是Thread 的子类)(Runnable )
●可运行状态( Runnable )
Thread myThread = new MyThreadClass( );myThread myThread..start();
12
●阻塞状态(Blocked )
调用了sleep ()方法;
为等候一个条件变量线程调用为等候个条件变量,线程调用wait ()方法;
输入输出流中发生线程阻塞;
●死亡状态(Dead )
自然撤消(线程执行完)
13
下面几种情况下,当前线程会放弃CPU ,几会
进入阻塞状态(blocked):
11.
线程调用sleep()方法主动放弃;
2.
由于当前线程进行I/O 访问,外存读写,等待用户输入等操作导致线程阻塞用户输入等操作,导致线程阻塞;
3.
为等候一个条件变量,线程调用wait ()方法;
4.线程试图调用另一个对象的线程试图调用另一个对象的““同步同步””方法,但那个对象处于锁定状态,暂时无法使用。
14
线程体的构造
●
public Thread( ThreadGroup group, Runnable target,String name )Runnable target, String name )
;
●任何实现接口Runnable 的对象都可以作为个线程的目标对象一个线程的目标对象;
15
●构造线程体的2种方法
●定义一个线程类,它继承类Thread 并重写其run()中的方法run( );
●提供一个实现接口Runnable 的类作为线程的目标对象在初始化一个目标对象,在初始化个Thread 类或者
Thread 子类的线程对象时,把目标对象传递给这个线程实例由该目标对象提供线程体给这个线程实例,由该目标对象提供线程体
run( )。
16
通过继承类Thread 构造线程体
class class SimpleThread
SimpleThread extends Thread {public SimpleThread SimpleThread(String (String str str)){public public SimpleThread SimpleThread(String (String str str) {) {super(super(str str););
}
public void run() {
(for (int 0;<10;++){
for (for (int int i = 0; = 0; i i < 10; < 10; i i ++) {System.out.println System.out.println((i +""++ " " + getName getName());());{
try {sleep((sleep((int int)()(Math.random Math.random() * 1000));() * 1000));} catch (} catch (InterruptedException InterruptedException e) {}17
}
S t t i tl ("DONE!"tN ())System.out.println System.out.println("DONE! " +("DONE! " +getName getName());());
}
}
public class public class TwoThreadsTest
TwoThreadsTest {bli t ti id i (St i []){public static void main (String public static void main (String args args[]) {[]) {
new new SimpleThread SimpleThread("First").start();("First").start();
new new SimpleThread SimpleThread("Second").start();("Second").start();}
}RUN
18
Fi
0First
0Second
S d 1Second
1First
2First
2Second
3Second
3First
4First
4Second
5First
5Second
19 6Second
Fi
6First
7First
S d 7Second
8Second
9Second
8First
DONE!Second
9First
DONE!First
20