java教学课件-第九章 多线程

上传人:aa****6 文档编号:56788901 上传时间:2018-10-15 格式:PPT 页数:50 大小:902KB
返回 下载 相关 举报
java教学课件-第九章 多线程_第1页
第1页 / 共50页
java教学课件-第九章 多线程_第2页
第2页 / 共50页
java教学课件-第九章 多线程_第3页
第3页 / 共50页
java教学课件-第九章 多线程_第4页
第4页 / 共50页
java教学课件-第九章 多线程_第5页
第5页 / 共50页
点击查看更多>>
资源描述

《java教学课件-第九章 多线程》由会员分享,可在线阅读,更多相关《java教学课件-第九章 多线程(50页珍藏版)》请在金锄头文库上搜索。

1、Java275 多线程,东软IT人才实训中心,课程结构,课程结构(续),第十五章 多线程,学时:6学时教学方法:讲授ppt上机练习,目标:Java线程机制及线程与进程的区别。Java线程模型。Java多线程实现的两种方式:接口和继承。线程的状态及其生命周期。线程相关类的常用方法的使用。线程的休眠,中断及优先级。什么是守护线程。线程的同步,和并和死锁,Threads,学习目标: 认识Threads机制 Threads的操作和使用,Threads,认识Threads什么是进程? 如,当我们用JVM来执行class文件时,电脑会从磁盘中把程序代码加载到内存中执行,这时我们就把执行中的程序叫做”进程”

2、(process)。什么是Threads?进程又和Threads有什么不同? Java程序运行需启动Java虚拟机,虚拟机就是一个进程。程序运行时,虚拟机启动一个线程,调用程序的main()方法,该线程称为程序的主线程。其后由主线程启动其它线程。,Threads,一个进程包括三个部分来组成: 一个是CPU, 一个是执行的程序代码(code), 一个是程序执行所处理的数据(data)。,Code,Data,CPU,Threads,注: 每一个进程是独立的,保有自己的CPU,程序代码和数据,就算用同一份程序代码产生好几个进程,它们之间还是拥有自己的这三样东西。这时就可以发现一个问题,就是有些东西好

3、想重复浪费掉了,例如程序代码,一些共用的常量等,这些东西应该是每个进程共用的,可是偏偏每个进程都各自有一份,这样不但造成内存的浪费,也造成了CPU的负担,所以有了Threads机制,它可以达到同一份程序产生好几个进程的效果,但是不同的Threads之间可以有某种程度的资源共享,所以可以把Threads称为轻量级的进程(lightweight process)。,Threads,注: 因为Threads有许多优点,所以当初Java设计小组就把这样的机制加进Java程序语言中,使得Java程序天生就具备有multi-threads(多线程)的能力。,Threads,建立ThreadsJava程序中

4、负责Threads这个功能的是java.lang.Thread这个类。创建Thread类对象有两种方式:第一种: 继承Thread类,复写“run”方法; 例:275-14-1第二种: 不继承Thread类,实现Runnable接口,然后复写“run”方法。 例:275-14-2,Threads,哪种方式更好,实现Runnable接口方式:理由: 1.较符合面向对象设计的精神与架构 2.Java类只能单一继承,但能实现多个接口 3.程序的一致性,Threads,产生Thread对象Thread() 分配新的 Thread 对象 例: Threads_Test01 t1 = new Thread

5、s_Test01();Thread(Runnable target) 分配新的 Thread 对象 例: Thread t2 = new Thread(new Runnable_Test01();,Threads,Threads架构图,Code,Data,CPU,Runnable_Test01类,Runnable_Test01对象,Thread对象 t2,Threads,Threads操作四种操作Threads的基本方法: start, sleep, join, 和yield,Threads,启动Threads启动Thread对象的方法”start”,功能是通知Thread对象可以准备开始执行

6、run方法中的程序了。,Threads,Threads状态转移图(一),new,Runnable,Running,调用start方法,进入等待执行状态,CPU调度,Threads,注: 由于系统中同一时刻不止一个Thread对象在执行,而且每种操作系统都有不同的方式,至于什么时候系统会从等待执行的Threads中取出一个来执行,我们无法预测它的实行时间和顺序。当系统选定了一个等待执行中的Thread对象后,它就会从等待执行状态进入执行状态,系统挑选的动作我们称之为”CPU调度“(schedule)。被挑选到的Threads执行一阵子后,就会被系统给换下来回到等待状态,然后又会在挑选下一个Thr

7、eads执行。,Threads,示例:275-14-3,Threads,注: 一个Thread对象只能调用start方法一次,所以如果对一个已经启动的Thread对象,再次调用start方法,会产生“IllegalThreadStateException”异常。main方法本身也是一个Threads。,Threads,停止Threads执行JDK1.0时提供了一个stop方法来停止线程,但是这个方法会造成系统进入不安全状态,所以在JDK1.1之后就取消了这个方法,虽然目前这个方法还存在,但是我们没有办法使用它。让一个线程停止,就是当它把run方法中的程序代码执行完后,就进入”死亡”(dead)

8、状态了。,Threads,Threads状态转移图(二),new,Dead,Runnable,Running,调用start方法,run方法执行完毕,CPU调度,Threads,如果要让run方法中的程序代码执行不完,那么Thread对象就会不断地执行下去。例:275-14-4,Threads,注:当一个Thread对象进入死亡状态后,就没有任何方法回到其他状态了,也就是说人死不能复生!要想让Thread对象在重新执行一次,只有唯一的方法,就是重新再产生一个Thread对象。,Threads,暂停Threads执行三种方法:1.sleep方法 2.yield方法 3.join方法,Thread

9、s,1.Sleep方法 Sleep就是让Thread对象“睡”一下,然后再设定一个闹钟,时间一到,它又会恢复执行。static void sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),Threads,Threads状态转移图(三),new,Dead,Runnable,Running,调用start方法,run方法执行完毕,CPU调度,Blocked pool,unblocked,blocking event,Threads,注:当一个Thread对象睡醒后,不是立刻进入执行状态来执行,而是进入等待执行状态,在那里等待被系统挑选到,才会被执行!因此s

10、leep方法所传入的时间,只是保证这个Thread对象“至少”会停止这么长的时间。,Threads,例:275-14-5,Threads,2.yield有另外一个方法也能让Thread对象立刻暂时停止运行,并且直接从执行状态到等待执行状态,这个方法就是”yield”。,Threads,例:275-14-6,Threads,注: 上例中两个Thread执行时间都比较短,可能只花了0.01秒的时间,CPU还来不及把它们换下来,他们就停止执行了,所以,如果时间久一点,就不一定会先某个Threads执行完,才轮到另一个Threads执行。,Threads,3.join当一个系统中有好几个Threads

11、在执行,有时候某个Threads甲需要等待另一个Threads乙完成某件事情后,甲才能继续执行下去,这时甲在乙还没执行完成之前,就必须要做等待的工作。要让某个Threads等待另一个Threads执行完后,它才能继续执行,这时我们需要用到”join”方法。,Threads,例:妈妈煮饭,发现没有米酒,让儿子去买,妈妈只能等待儿子把米酒买回来才能继续煮饭例:275-14-7,Threads,取得Threads信息的相关方法:boolean isAlive() 测试线程是否处于活动状态void setName(String name) 改变线程名称,使之与参数 name 相同String getN

12、ame() 返回该线程的名称static Thread currentThread() 返回对当前正在执行的线程对象的引用。,Threads,int getPriority() 返回线程的优先级。void setPriority(int newPriority) 更改线程的优先级。String toString() 返回该线程的字符串表示形式,包括线程名称、优先级和线程组。,Threads,数据同步处理不同的Threads之间,程序代码可以共用,数据也可以共用,只有CPU不能共用,每个Threads都以为自己拥有自己的CPU。程序代码共用没有太大问题,因为程序是写好的就放在那,数据的共用就有很

13、大的问题!,Threads,例:275-14-8,Threads,synchronized关键字 把一段程序代码给锁起来,用的是synchronized关键字。语法: synchronized(要取得锁的对象) 要锁定的程序代码 ,Threads,注:受到synchronized保护的程序代码中,要访问的对象属性必须设定为private,因为如果不设定为private,那么就可以用不同的方式来访问它,这样就达不到保护的效果了。,Threads,synchronized指令还有另外一种用法:就是把它写在方法的声明上,例如:public synchronized void method() ,Th

14、reads,两种方式的优缺点:1.写在方法上声明优点: 用javadoc制作说明文件时,可以知道哪些方法是synchronized。缺点: 1.方法中有些程序是不需要保护的,如果该方法执行会花很长时间,那么其他人就要花较多时间等待锁被归还;2.只能取得自己对象的锁,有时候程序设计的需求,可能会需要取得其他对象的锁;,Threads,2.只对某个程序段锁定优点: 可以针对某段程序代码锁定,不需要浪费时间在别的程序代码上; 可以取得不同对象的锁;缺点: 从文件中别人无法得知哪些方法是synchronized的;,Threads,Threads状态转移图(四),new,Dead,Runnable,R

15、unning,调用start方法,run方法执行完毕,CPU调度,Blocked pool,unblocked,blocking event,Lock Pool,取得锁,synchronized,Threads,例:275-14-9,Threads,注:乱用synchronized可能会造成系统打死锁(Dead Lock)的状况!锁的归还几种方式:1.基本上执行完锁定的程序代码后,锁就会自动归还; 2.用break语句跳出锁定的语句块,不过这对于写在方法声明的synchronized没有作用; 3.遇到return语句; 4.遇到了异常;,Threads,Threads高级操作相关方法:voi

16、d wait() 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。void notify() 唤醒在此对象监视器上等待的单个线程。void notifyAll() 唤醒在此对象监视器上等待的所有线程。,Threads,Threads状态转移图(五),new,Dead,Runnable,Running,调用start方法,run方法执行完毕,CPU调度,Blocked pool,unblocked,blocking event,Lock Pool,取得锁,synchronized,wait pool,调用wait方法,调用notify方法,Threads,例:275-14-10,术语,Copyright 2008 版权所有 东软集团,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > 教育/培训/课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号