第9章 多线程程序设计ppt课件.ppt

第9章 多线程程序设计ppt课件.ppt

ID:59212993

大小:105.50 KB

页数:38页

时间:2020-09-26

上传者:U-5097
第9章 多线程程序设计ppt课件.ppt_第1页
第9章 多线程程序设计ppt课件.ppt_第2页
第9章 多线程程序设计ppt课件.ppt_第3页
第9章 多线程程序设计ppt课件.ppt_第4页
第9章 多线程程序设计ppt课件.ppt_第5页
资源描述:

《第9章 多线程程序设计ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

9多线程程序设计9.1引例:简单的多线程程序9.2线程概述9.3Java线程类和接口9.4线程调度与控制9.5线程的同步机制9.6应用实例:定时器 9.1引例:简单的多线程程序【例9-1】简单的多线程程序FirstThread.java必须通过用户强制中断的方式才能结束,即MS-DOS方式下按Ctrl-C键,NetBeans平台下通过选择【运行】菜单的【停止构建/运行】选项 9.2线程概述多任务分时环境 9.2线程概述多进程并发处理 9.2线程概述多线程并发处理 9.2线程概述Java程序运行在JVM下对于操作系统来说,JVM是系统中运行的众多进程之一每个运行在JVM下的Java程序都是JVM进程中的线程例如,执行Java应用程序会首先调用main()方法,此时生成一个被称为主线程的线程,主线程结束意味着main()方法运行结束 9.2线程概述Java的程序是单线程的,但它提供了类和接口来实现多线程程序java.lang包中的Thread类和Runnable接口 9.3Java线程类和接口9.3.1Thread类9.3.2Runnable接口 9.3.1Thread类将类声明为Thread类的子类可以使Java程序能够多线程运行该子类必须覆盖Thread类的run()方法,将所有多线程代码放在run()方法中例如:publicclassMyThreadextendsThread{...publicvoidrun(){...}} 9.3.1Thread类Thread类常用构造方法 9.3.1Thread类Thread类常用成员方法 9.3.1Thread类 9.3.1Thread类【例9-2】可以和用户交互的多线程程序MyThread.java,MyThreadTest.java 9.3.2Runnable接口Java只支持单重继承如果一个类继承了Thread类,就不能再继承其他类了对此,Java提供了另一种途经,通过实现Runnable接口来定义多线程类 9.3.2Runnable接口Runnable接口中仅声明了run()方法:voidrun();实现Runnable接口的类必须实现run()方法,例如:publicclassMyRunnableimplementsRunnable{publicvoidrun(){...}}Thread类就实现了Runnable接口,只不过run()方法体是空的 9.3.2Runnable接口实现了Runnable接口的对象创建线程时,需要用它作为参数创建一个Thread类对象,之后如一般的Thread对象那样调用start()方法启动线程执行run()方法例如:MyRunnabler=newMyRunnable();Threadt=newThread(r);t.start(); 9.3.2Runnable接口【例9-3】使用Runnable接口的多线程程序MyRunnable.java,MyRunnableTest.java 9.4线程调度与控制9.4.1线程状态9.4.2线程调度9.4.3线程控制 9.4.1线程状态线程不同状态之间的转换 9.4.2线程调度处于就绪状态的线程自动获得一个反映线程重要或紧急程度的优先级,并按照优先级排队等待CPU资源Java中,JVM负责线程的调度,在优先级的基础上依据“先到先服务”的原则为各线程分配CPU使用权如果有更高优先级的线程进入就绪状态,该线程将抢占低优先级线程所使用的CPU 9.4.2线程调度获得CPU使用权的线程在出现下列情况之一时让出CPU:JVM强制线程放弃CPU,如CPU时间到、有更高优先级线程进入就绪状态因某种原因导致线程不能再继续运行下去,如等待输入输出、休眠、等待消息等run()方法执行结束,或被强行退出 9.4.2线程调度JVM进行线程调度,主要依据优先级Java线程的优先级从1到10,其中10的优先级最高Thread类定义了三个静态int型常量MAX_PRIORITY、MIN_PRIORITY和NORM_PRIORITY分别表示优先级10、1和5,默认是5 9.4.2线程调度Thread类的setPriority()和getPriority()方法分别用来设置和获取线程的优先级:publicfinalvoidsetPriority(intnewPriority)publicfinalintgetPriority() 9.4.3线程控制线程休眠:publicstaticvoidsleep(longmillis)throwsInterruptedException让出CPU时间:publicstaticvoidyield() 9.4.3线程控制等待其他线程结束publicfinalvoidjoin()throwsInterruptedExceptionpublicfinalvoidjoin(longmillis)throwsInterruptedException 9.4.3线程控制守护线程:publicfinalvoidsetDaemon(booleanon)publicfinalbooleanisDaemon() 9.5线程的同步机制9.5.1共享资源9.5.2线程同步9.5.3线程通信 9.5.1共享资源【例9-4】多线程访问共享资源SharedData.java,SharedDataTest.java如果不希望程序运行中的情况发生,需要引入线程同步机制,即各线程依照一定的规则访问共享资源 9.5.2线程同步实现线程同步使用synchronized关键字synchronized有两种用法:同步方法和同步代码块声明了synchronized的方法或代码块任何时候都只能有一个线程在运行 9.5.2线程同步同步方法:synchronized方法声明{//方法体}【例9-5】线程同步实现数据共享SharedDataSync.java,SharedDataSyncTest.java 9.5.2线程同步同步代码块:synchronized(obj){//同步代码}obj是某个对象,进入同步代码块的线程必须先获得obj的锁 9.5.2线程同步注意实现线程同步时,必须使用同一个对象锁如果obj是this,则与同步方法效果相同,因为this就是当前对象本身使用同步代码块时,不能用方法内的局部变量来做对象锁 9.5.2线程同步同步方法和同步代码块的区别:前者同步的代码范围大于后者同步的代码范围,更容易引起死锁,还会降低系统的运行效率通常来说,同步的代码范围越小越好,因此尽管同步方法简单,但更好的办法是使用同步代码块 9.5.3线程通信Object类定义的wait()、notify()和notifyAll()方法为同步操作的不同线程提供了一种通信手段所有类都继承了这些方法 9.5.3线程通信wait()方法令当前线程转为阻塞状态,释放对象锁,并在其他线程调用notify()方法或notifyAll()方法后,由阻塞状态转为就绪状态publicfinalvoidwait()throwsInterruptedExceptionpublicfinalvoidwait(longtimeout)throwsInterruptedException 9.5.3线程通信notify()方法用于唤醒当前对象的一个等待线程,使它由阻塞状态转为就绪状态publicfinalvoidnotify()notifyAll()方法用于唤醒当前对象的所有满足被唤醒条件的等待线程publicfinalvoidnotifyAll() 9.5.3线程通信注意,wait()、notify()和notifyAll()方法必须在声明了synchronized的方法或代码块中使用,否则会抛出IllegalMonitorStateException异常 9.6应用实例:定时器【例9-6】定时器TimeerThread.java,Timer.java,TimerTest.java

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭