《java 第7章 多线程课件》由会员分享,可在线阅读,更多相关《java 第7章 多线程课件(41页珍藏版)》请在金锄头文库上搜索。
1、Java 的多线程机制,Java的多线程机制,2,主要内容,线程的概念 线程的生命周期 Java中多线程的编程 继承Thread类与使用Runnable接口 Thread类的主要方法 线程的同步与死锁 动画,Java的多线程机制,3,程序 - 进程 - 线程,程序是为完成特定任务、用某种语言编写的 一组指令的集合。指一段静态的代码。 进程是程序的一次执行过程,是系统进行调 度和资源分配的一个独立单位。,Java的多线程机制,4,程序-进程-线程,线程是比进程更小一级的执行单元。 一个进程在其执行过程中,可以产生多个线程,形 成多条执行线索。 每个线程也有它自身的产生、存在和消亡的过程, 也是一
2、个动态的概念。 一个线程有它自己的入口和出口,以及一个顺序执 行的序列 线程不能独立存在,必须存在于进程中,各线程间 共享进程空间的数据。 线程 线程创建、销毁和切换的负荷远小于进程, 又称为轻量级进程(lightweight process)。 系统负担小,主要是CPU的分配。,Java的多线程机制,5,基本概念之一:进程,进程是正在运行的一个程序 程序:静态对象进程:动态过程 操作系统为每个进程分配一段内存空间, 包括:代码、数据以及堆栈等资源 多任务的操作系统(OS)中,进程切换对 CPU资源消耗较大,Java的多线程机制,6,基本概念之二:多线程,多线程是指同时存在几个执行体,按几条不
3、 同的执行线索共同工作的情况。 多线程实现单个进程中的并发计算。 各线程间共享进程空间的数据,并利用这些 共享单元来实现数据交换、实时通信与必要 的同步操作。 多线程的程序能更好地表述和解决现实世界 的具体问题,是计算机应用开发和程序设计 的一个必然发展趋势。,Java的多线程机制,7,进程与多线程,Java的多线程机制,8,线程的调度,调度策略 时间片 抢占式:高优先级的线程抢占CPU Java的调度方法 同优先级线程组成先进先出队列,使用时间片策略 对高优先级,使用优先调度的抢占式策略,1,2,Java的多线程机制,9,Java与多线程,Java语言的一个重要功能特点就是内置对多 线程的支
4、持,它使得编程人员可以很方便地 开发出具有多线程功能,能同时处理多个任 务的功能强大的应用程序。 每个Java程序都有一个隐含的主线程 application main 方法 Applet小程序,主线程指挥浏览器加载并执 行 Java小程序。,Java的多线程机制,10,线程的生命周期,要想实现线程,必须在主线程中创建新的线程对象。Java语言使用Thread类及其子类的对象来表示线程,在它的一个完整的生命周期中通常要经历如下的五种状态: 新建: 当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态 就绪:处于新建状态的线程被启动后,将进入线程队列等待CPU时间片,此时
5、它已具备了运行的条件 运行:当就绪的线程被调度并获得处理器资源时,便进入运行状态, run()方法定义了线程的操作和功能 阻塞:在某种特殊情况下,被人为挂起或执行输入输出操作时,让出CPU并临时中止自己的执行,进入阻塞状态 死亡:线程完成了它的全部工作或线程被提前强制性地中止 stop()或destroy(),Java的多线程机制,11,线程状态,Java的多线程机制,12,Java对多线程的支持,提供对多线程的支持 Thread类 start( ), stop( ), run( ) Runnable 接口 实现多线程的两种编程方法 继承 Thread 类 实现 Runnable 接口,Jav
6、a的多线程机制,13,法之一:继承Thread类,Thread类的重要方法:run( ) 定义线程的具体操作 系统调度此线程时自动执行 初始时无具体操作内容 如何编程呢?,继承Thread类,定义 run( ) 方法,Java的多线程机制,14,Easy? Lets try it!,小例子: SimpleThread.java TwoThreadsTest.java,Java的多线程机制,15,Java的多线程机制,16,Thread类,java.lang包 构造函数 Thread(); Thread(String threadname); 指定线程实例名 线程的优先级控制 三个常量: MAX
7、_PRIORITY 10; MIN _PRIORITY 1; NORM_PRIORITY 5; getPriority() 返回线程优先值 setPriority(int newPriority) 改变线程的优先级 线程创建时继承父线程的优先级,Java的多线程机制,17,Thread类的有关方法,void start(): 由Newborn到Runnable 启动线程 String getName(): 返回线程的名称 run(): 线程在被调度时执行的操作 static void sleep(指定时间毫秒): 令当前活动线程在指定时间段内放弃对CPU控制,使 其他线程有机会被执行,时间到后
8、重排队 产生例外InterruptedException 用try块调用sleep(),用catch块处理例外,Java的多线程机制,18,Thread类的有关方法(续),suspend() :挂起线程,处于阻塞状态 resume():恢复挂起的线程,重新进入就绪队 列排队 应用:可控制某线程的暂停与继续 方法:设一状态变量suspendStatus=false(初始) 暂停:if(!suspendStatus) T.suspend(); suspendStatus=true; 继续:if(suspendStatus) T.resume(); suspendStatus=false;,Java
9、的多线程机制,19,Thread类的有关方法(续),static void yield():对正在执行的线程 若就绪队列中有与当前线程同优先级的排队线程, 则当前线程让出CPU控制权,移到队尾 若队列中没有同优先级的线程,忽略此方法 stop(): 强制线程生命期结束 boolean isAlive():返回boolean,表明是否线程还 存在 static currentThread(): 返回当前线程,Java的多线程机制,20,生成与运行线程 方法1,Java的多线程机制,21,Thread类方法总结,启动线程:start() 有关线程执行的控制: stop()、suspend()、re
10、sume() 有关调度控制 Thread.sleep(10); /低优先级的线程也可以获得执行 Thread.yield(); /同优先级的线程可以获得执行 suspend(); /暂停本线程,Java的多线程机制,22,方法之二:Runnable,Runnable接口 自定义类实现Runnable接口 使用Thread类的另一构造函数: Thread(Runnable) 用实现了Runnable接口的类的对象中所定义的 run()方法, 来覆盖新创建的线程对象的run() 方法 使用start()启动线程,Java的多线程机制,23,方法之二:Runnable(续),例: class A i
11、mplements Runnable public void run(). class B public static void main(String arg) Runnable a=new A(); Thread t=new Thread(a); t.start(); ,Java的多线程机制,24,建立线程例,public class ThreadTest public static void main(String args) Job1 j = new Job1(); Thread t1 = new Thread(j) ; t1.start() ; class Job1 implemen
12、ts Runnable int i =1 ; public void run() while (i50) System.out.println(i+) ; ,Java的多线程机制,25,生成与运行线程 方法2,class MyRun implements Runnable public void run() 线程体 MyRun mr = new MyRun(); Thread t1 = new Thread(mr) ; t1.start(); /Thread实例用于线程控制 适合于:定义run()方法的类是其他类的子类。,Java的多线程机制,26,方法之二:Runnable(续),两种方法的
13、选择 当需要从其他类,如Applet类继承时,使用Runnable接口 当编写简单的程序时,可考虑使用继承Thread类 例:RaceApplet.java 具体运行结果(线程调度)与平台有关,Java的多线程机制,27,Java的多线程机制,28,public void init() /重载Applet的init()方法 for (int i = 0; i NUMRUNNERS; i+) runnersi = new Runner(); /创建赛跑线程线程 runnersi.setPriority(i+1); /设优先级first=1,second=2 if (updateThread =
14、null) /创建绘图线程,并设优先级为3 updateThread = new Thread(this, Thread Race); updateThread.setPriority(NUMRUNNERS+1); addMouseListener(new MyAdapter(); /注册事件监听者 /end of init(),Java的多线程机制,29,/ 内部事件监听者类,监听鼠标事件 class MyAdapter extends MouseAdapter /鼠标点击后,开始赛跑及绘制线程 public void mouseClicked(MouseEvent evt) if (!up
15、dateThread.isAlive() updateThread.start(); /启动绘制线程 for (int i = 0; i NUMRUNNERS; i+) if (!runnersi.isAlive() runnersi.start(); /启动赛跑线程 /end of class MyAdapter,Java的多线程机制,30,public void paint(Graphics g) /paint()方法中绘制框架 /end of paint() /update()方法中绘制赛跑者的进度 public void update(Graphics g) for (int i =
16、0; i NUMRUNNERS; i+) /画两条线 g.drawLine(SPACING, (i+1)*SPACING, SPACING + (runnersi.tick)/100000, (i+1)*SPACING); /end of update(),Java的多线程机制,31,public void run() /实现Runnable接口的run()方法 while (true) repaint(); /重新绘制,自动调用update()方法 try Thread.sleep(10); /休眠,把执行机会让给低优先级线程 catch (InterruptedException e) /end