




免费预览已结束,剩余27页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章 线程,本章导读,线程的概念 线程的优先级 线程的生命周期 线程的创建 线程的常用方法 线程同步 线程联合,本章导读,线程的概念 线程的优先级 线程的生命周期 线程的创建 线程的常用方法 线程同步 线程联合,线程的概念,没有线程的例子 (程序8-1)testnonethread.java 有线程的例子 (程序8-2)testwiththread.java,线程的概念,java应用程序总是从主类的main方法开始执行 当jvm加载代码,发现main方法之后,就会启动一个线程,这个线程称作“主线程” 如果main方法中没有创建其他的线程,那么当main方法执行完最后一个语句,即main方法返回时,jvm就会结束java应用程序,线程的概念,如果main方法中又创建了其他线程,那么jvm就要在主线程和其他线程之间轮流切换,保证每个线程都有机会使用cpu资源 jvm一直要等到主线程中的所有线程都结束之后,才结束java应用程序,本章导读,线程的概念 线程的优先级 线程的生命周期 线程的创建 线程的常用方法 线程同步 线程联合,线程的优先级,java虚拟机中的线程调度器负责管理线程,调度器把线程的优先级分为10个级别,分别用110来表示 thread.min_priority /最低优先级,通常为1 thread.norm_priority /普通优先级,默认值是5 thread.max_priority /最高优先级,通常是10 如果没有明确地设置线程的优先级别,每个线程的优先级都为常数5 (包括主线程),线程的优先级,获取线程的优先级 public final int getpriority() 设置线程的优先级 public final void setpriority(int newpriority) 在实际编程时,不提倡使用线程的优先级来保证程序的正确运行。,本章导读,线程的概念 线程的优先级 线程的生命周期 线程的创建 线程的常用方法 线程同步 线程联合,线程的生命周期,新建 thread类及其子类创建的对象称为线程 运行 线程创建后还没有运行的资格,必须调用start()方法通知java虚拟机,它才有机会获得cpu的使用权,从而运行 轮到某个线程运行时,java虚拟机就把cpu的拥有权交给这个线程,并调用这个线程的run()方法,线程的生命周期,中断 jvm将cpu资源从当前线程切换给其他线程 线程使用cpu资源期间,执行了sleep(long millsecond),进入休眠状态,休眠时间结束或者休眠被吵醒(interrupt),才能退出休眠状态 线程使用cpu资源期间执行了wait()方法,则这个线程的执行中断,进入等待状态。有两个方法结束等待:notify()和notifyall() 若线程在执行期间执行了阻塞线程的某个操作,例如读取键盘输入的字符等,则这个线程中断。只有消除阻塞原因,才能等待jvm分配cpu资源,线程的生命周期,死亡 处于死亡状态的线程不具有继续运行的能力,线程死亡的原因 正常运行的线程完成了它的全部工作,即执行完run方法中的全部语句,结束了run方法 线程被提前强制性地终止,即强制run方法结束,本章导读,线程的概念 线程的优先级 线程的生命周期 线程的创建 线程的常用方法 线程同步 线程联合,线程的创建,thread类的构造方法 通过继承thread类创建线程 通过实现runnable接口创建线程 两种创建线程的方式比较,thread类的构造方法,thread类在java.lang包中,所以,使用这个类不需要引入类或者包 常用构造方法 public thread() public thread(string name) public thread(runnable target),通过继承thread类创建线程,通过继承thread类、重写run()方法而创建线程 程序8-3 testextendsthread.java 定义了线程类subthread,在主方法中创建了这样一个线程并把它启动 (练习1)example1.java,通过实现runnable接口创建线程,runnable是java.lang包中的接口 public interface runnable public void run(); 某个类实现runnable接口,实现其方法run()后,可以把这个类新创建的实例传递给线程对象,线程对象被启动后,运行的是被实现了的run()方法 程序8-4 testimplementsrunnable.java中的runclass类实现了runnable接口,两种创建线程的方式比较,采用继承thread类的方式,在run()方法中可以直接调用线程的其它方法,但继承thread类后,由于java的单继承性,就不能继承其它的类 采用实现runnable接口的方式,不影响类继承其它的类,建议采用实现runnable接口的方式,本章导读,线程的概念 线程的优先级 线程的生命周期 线程的创建 线程的常用方法 线程同步 线程联合,线程的常用方法,public static void sleep(long millsecond) throws interruptedexception 线程休眠millsecond毫秒。执行这条语句后,线程处于中断状态,sleep()方法结束后,线程进入排队状态 public final boolean isalive() 检查线程是否出于运行状态,线程出于运行状态时,isalive()方法返回true,线程进入死亡状态之后,isalive()方法返回false,线程的常用方法,public void interrupt() 用来“吵醒”休眠的线程,从而结束休眠,重新排队等待cpu资源 public static thread currentthread() 可以返回当前正在使用的cpu资源的线程,线程的常用方法,(练习2)example2.java (练习3)example3.java,本章导读,线程的概念 线程的优先级 线程的生命周期 线程的创建 线程的常用方法 线程同步 线程联合,线程同步,当两个或多个线程同时访问同一个变量时,可能发生混乱 比如,当一个线程正在修改文件的内容时,如果另一个线程也要修改同样的文件,就会出现混乱的局面 在处理线程同步时,把修改数据的方法用关键字synchronized来修饰 一个方法使用关键字synchronized修饰后,如果一个线程正在使用该方法,在该方法返回之前,其他线程需要排队等待cpu资源,以便使用这个方法。,线程同步,(练习4)example4.java 本例有两个线程:accountant和cashier,他俩共同拥有一个帐本,都可以使用saveortake(int number)对帐本进行访问 会计使用saveortake方法时,向帐本上写入存钱记录;出纳使用saveortake方法时,向帐本写入取钱记录 当会计正在使用saveortake方法时,出纳被禁止使用,反之也是这样,在同步方法中使用wait()、notify和notifyall,当一个线程使用的同步方法中用到某个变量,而此变量又需要其它线程修改后才能符合本线程的需要,那么可以在同步方法中使用wait()方法 使用wait()方法可以中断方法的执行,使本线程等待,暂时让出cpu的使用权,并允许其它线程使用这个同步方法 其它线程如果在使用同步方法时不需要等待,那么它使用完这个同步方法后,应当用notifyall()方法通知所有的由于使用这个同步方法而处于等待的线程结束等待 如果使用notify(),是通知处于等待中的线程的某一个结束等待,在同步方法中使用wait()、notify()和notifyall(),(练习5)example5.java 模拟3个人排队买票,每人买1张票 售票员只有1张五元的钱,电影票五元钱一张 张某拿1张二十元的人民币排在孙某前面买票,孙某拿1张十元的人民币排在赵的前面买票,赵某拿1张五元的人民币排在最后,本章导读,线程的概念 线程的优先级 线程的生命周期 线程的创建 线程的常用方法 线程同步 线程联合,线程联合,一个线程a在占有cpu资源期间,可以让其它线程调用join()和本线程联合, 如:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论