JAVA应用22--5.28

上传人:da****ge 文档编号:243098190 上传时间:2024-09-15 格式:PPT 页数:32 大小:169.50KB
返回 下载 相关 举报
JAVA应用22--5.28_第1页
第1页 / 共32页
JAVA应用22--5.28_第2页
第2页 / 共32页
JAVA应用22--5.28_第3页
第3页 / 共32页
点击查看更多>>
资源描述
单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,宜宾职业技术学院计算机应用与网络专业,多线程基础知识,钱新杰,1,、使用相对,URL,地址一般要使用,getCodeBase,和,getDocumentBase,两个方法,简述其作用?,2,、简述,g.drawImage,(,picture,x,y,width,,,height,,,this,)各参数的作用,?,复习提问,线程的基本概念,线程的属性,线程的,优先级,本次课学习目标,我们已经对多任务非常熟悉,,Windows,和,Linux,都是多任务的操作系统。这些操作系统可以同时运行两个或两个以上的程序,并且看起来这些程序似乎在同时运行。操作系统负责把系统资源分配给这些运行中的程序,并让人感觉它们是并发活动的。,线程的基本概念,实现多任务通常有两种方法,一种称为,抢占式多任务,(preemptive multitasking),;,一种叫,合作式多任务,(cooperative multitasking),。,对于抢占式多任务,操作系统自行决定何时中断一个程序,将执行时间分给其他程序。相反,对于合作式多任务操作系统将与程序进行协商,只有程序自愿放弃控制时才被中断。,多线程把操作系统的多任务原理应用到程序中,进一步发展了这一原理。应用了多线程技术的程序如同多任务操作系统一样,可以同时执行多个任务。每个任务被称为一个线程,它是线程控制流的简称。,Java,语言本身也使用一个线程在后台收集无用的内存单元,这样就减少了用户管理内存的麻烦!,通常,把操作系统的多个任务称为进程,(Process),,,而程序中的多任务则称为线程。,线程和进程之间有什么区别:,最基本的区别就是每个进程都拥有一组完整的属于自己的变量,而线程则共享这些数据。,和进程间的通信相比,线程间的通信要快得多,也方便得多。,线程,一个线程是给定的指令的序列,(,你所编写的代码,),、一个栈,(,在给定的方法中定义的变量,),,以及一些共享数据,(,类一级的变量,),。线程也可以从全局类中访问静态数据。,创建线程,在,Java,平台中,创建一个线程非常简单,最直接的方法就是从线程类,java.lang.Thread,继承。在缺省情况下,线程类可以被所有的,Java,应用程序调用。,java.lang.Thread,类中定义的五个方法:,run(),:,该方法用于线程的执行。你需要重载该方法,以便让线程做特定的工作。,start(),:,该方法使得线程启动,run(),方法。,stop(),:,该方法同,start(),方法的作用相反,用于停止线程的运行。,suspend(),:,该方法同,stop(),方法不同的是,它并不终止未完成的线程,而只是挂起线程,以后还可恢复。,resume(),:,该方法重新启动已经挂起的线程。,实例,新创建的类重载了,run(),方法,但实现,run(),方法不必很严格,因为,Thread,类可提供一个缺省的,run(),方法,尽管它不是特别有用。其运行结果如下:,Thread A running for 2 iterations,Thread A sleeping for 913ms between loops,Thread A 0,Thread B running for 12 iterations,Thread B sleeping for 575ms between loops,Thread B 0,Thread C running for 4 iterations,Thread C sleeping for 370ms between loops,Thread C 0,Thread C 1,Thread B 1,Thread C 2,Thread A 1,Thread C 3,Thread B 2,Thread B 3,Thread B 4,Thread B 5,Thread B 6,Thread B 7,Thread B 8,Thread B 9,Thread B 10,Thread B 11,使用,Runnable,接口,有时,不能重新定义父类,或者不能定义派生的线程类,但也许你的类的层次要求父类为特定的类,然而,,Java,语言是不支持多父类的。在这些情况下,可以通过,Runnable,接口来实现多线程的功能。,Thread,类本身也实现了,Runnable,接口。一个,Runnable,接口提供了一个,public void run(),方法。,实例,2,使用,Runnable,接口,需要实现,run(),方法。也需要创建,Thread,对象的一个实例,它最终是用来调用,run(),方法的。,首先,,main(),方法构造了,Test,类的一个实例,r,。,实例,r,有它自己的数据,在这里就是整数,i,。,因为实例,r,是传给,Thread,的类构造函数的,所以,r,的整数,i,就是线程运行时刻所操作的数据。,一个多线程编程环境允许创建基于同一个,Runnable,实例的多个线程。这可以通过以下方法来做到:,Thread t1= new Thread(r);,Thread t2= new Thread(r);,此时,这两个线程共享数据和代码。,使用,Runnable,的原因,从面向对象的角度来看,,Thread,类是一个虚拟处理机严格的封装,因此只有当处理机模型修改或扩展时,才应该继承类。,由于,Java,技术只允许单一继承,所以如果你已经继承了,Thread,,,你就不能再继承其他任何类,例如,Applet,。,在某些情况下,这会使你只能采用实现,Runnable,的方法。,线程有四种状态,分别为:,new(,初始态,),:一个线程在调用,new(),方法之后,调用,start(),方法之前所处的状态。在初始态中,可以调用,start(),和,stop(),方法。,线 程 的 属 性,Runnable,(,可运行状态,),:一旦线程调用了,start(),方法,线程就转到,Runnable,(),状态。注意,如果线程处于,Runnable,状态,它也有可能不在运行,这是因为还存在优先级和调度问题。,blocked(,阻塞,/,挂起状态,),:线程处于阻塞状态。这是由两种可能性造成的:因挂起而暂停;由于某些原因而阻塞,例如等待,IO,请求的完成等。,dead(,终止状态,),:线程转到退出状态。这有两种可能性:,run(),方法执行结束;调用了,stop(),方法。,所有可运行线程根据优先级保存在池中。当一个被阻塞的线程变成可运行时,它会被放回相应的可运行池。优先级最高的非空池中的线程会得到处理机时间,(,被运行,),。,因为,Java,线程不一定是分时的,所有你必须确保你的代码中的线程会不时地给另外一个线程运行的机会。这可以通过在各种时间间隔中发出,sleep(),调用来做到。,Thread,类的另一个方法,yield(),,,可以用来使具有相同优先级的线程获得执行的机会。如果具有相同优先级的其他线程是可运行的,,yield(),将把调用线程放到可运行池中并使另一个线程运行。如果没有相同优先级的可运行进程,,yield(),什么都不做。,sleep(),调用会给较低优先级线程一个运行的机会。,yield(),方法只会给相同优先级线程一个执行的机会。,线程的调度,线程类提供了四种对线程进行操作的重要方法:,sleep(),、,join(),、,wait(),和,notify(),。,sleep(),方法是使线程停止一段时间的方法。在,sleep,时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其他线程可能正在运行而且没有被调度为放弃执行,除非:,(a) “,醒来”的线程具有更高的优先级;,(b),正在运行的线程因为其他原因而阻塞。,join(),方法使得一个线程等待另外一个线程结束后再执行。例如,一个,GUI (,或者其他线程,),使用,join(),方法等待一个子线程执行完毕:,CompleteCalcThread,t = new,CompleteCalcThread,();,t.start();,/,做一会儿其他的事情,/,然后等待,t.join();,/,使用计算结果,join(),方法有三种格式:,void join(),:,等待线程执行完毕。,void join(long timeout),:,最多等待某段时间让线程完成。,void join(long milliseconds,,,int,nanoseconds),:,最多等待某段时间,(,毫秒纳秒,),,让线程完成。,对于编写线程的程序员来说,还有其他两个有用的方法,即,wait(),和,notify(),。,使用这两个,API,,可以精确地控制线程的执行过程。关于这两个方法的使用,将在后面详细解释。,线程的优先级,线程可以设定优先级,高优先级的线程可以安排在低优先级线程之前完成。一个应用程序可以通过使用线程中的,setPriority(int,),方法来设置线程的优先级大小。,Java,中,线程的优先级从低到高以整数,110,表示,共分为,10,级。设置优先级是通过调用线程对象的,setPriority,(),方法来进行的。设置优先级的语句为,Thread,threadone,=new Thread(); /,用,Thread,类的子类创建线程,Thread,threadtwo,=new Thread();,threadone.setPriority(6);,/,设置,threadone,的优先级为,6,threadtwo.setPriority(3);,/,设置,threadtwo,的优先级为,3,threadone.start,();,threadtwo.start,();,/,strat,(),方法启动线程,本次课主要为大家讲解了多线程的基本知识,要求学生掌握,线程的基本概念,,掌握,线程的属性和线程的,优先级等,为后续知识的学习做好准备。,小 结,查阅资料,作业布置,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!