语言程序设计第九章 ppt课件_第1页
语言程序设计第九章 ppt课件_第2页
语言程序设计第九章 ppt课件_第3页
语言程序设计第九章 ppt课件_第4页
语言程序设计第九章 ppt课件_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java面向对象程序设计第 9章 多线程本章主要内容l 多线程的概念l 线程的创建 继承 java.lang.Thread类 实现 java.lang.Runnable接口l 设置线程为后台线程、设置线程的优先级l 线程的同步:售票问题 程序块同步 方法同步l 线程间的通信:生产者与消费者问题l 线程的终止多线程概述l 并行编程通常能够显著地提高程序的性能。l 多进程:在操作系统中能同时运行多个任务 (程序 )。l 多线程:在同一应用程序 (进程 )中有多个顺序流同时执行。l 线程与进程的区别:每个进程都有自己的一组完整的变量,而线程则共享相同的数据。l 一个运行中的 Java程序是一个进程且至少包含一个线程,该线程也称为主线程。Java中使用多线程l 通常有两种建立线程的方法: 继承 java.lang.Thread类 实现 java.lang.Runnable接口Runnable接口public interface Runnablepublic void run( ); /线程体 Thread类public class Thread implements Runnable public void run( ) ; /线程体public void start( ) ; /启动线程 继承 Thread类实现多线程l Thread类的构造方法: Thread() Thread(Runnable target) Thread(String name)l 常用实例方法:static Thread currentThread() String getName() int getPriority() Thread.State getState() void interrupt() void run() void setDaemon(boolean on) void start() static void sleep(long millis) static void yield() 演示继承 Thread类创建线程继承 Thread类实现多线程l 设置后台线程(守护线程): setDaemon(true) 当 Java 虚拟机启动时,通常都会有单个非守护线程(它通常会调用某个指定类的 main 方法)。Java 虚拟机会继续执行线程,直到下列任一情况出现时为止: l 调用了 Runtime 类的 exit 方法,并且安全管理器允许退出操作发生。 l 非守护线程的所有线程都已停止运行。l 暂停线程: yield() 演示线程暂停和后台线程继承 Thread类实现多线程l 线程的优先级 每个线程都维护一个优先级的属性,该属性代表了该线程在程序中的重要程度, Java虚拟机将选择优先级最高的线程进入运行状态。 Thread类中提供了一些常量来表示某些优先级,Thread.MIN_PRIORITY表示最低优先级,Thread.MAX_PRIORITY表示最高优先级,Thread.NORM_PRIORITY表示普通优先级,默认情况下,线程的优先级是普通优先级。 除了这三个优先级, Java一共支持 10个优先级 。 通过 Thread.setPriority( )和 Thread.getPriority( )对线程的优先级进行修改与读取 。演示设置线程优先级实现 Runnable接口实现多线程l 通过实现 Runnable接口来实现线程,需要以下几步: ( 1)编写类,声明要实现 Runnable接口:public class SimpleThread implements Runnable ( 2)实现线程体 run( )方法,这里的代码是核心代码, run方法结束意味着线程结束:public void run( ). ( 3)利用 Thread其它的构造方法来构造线程对象,此时线程并没有执行:SimpleThread st = new SimpleThread ( );Thread t = new Thread(st); /st即为线程对象 ( 4)调用线程对象的 start( )方法,启动线程:t.start( );演示实现 Runnable接口实现多线程实现多线程l 应尽量采用实现 Runnable接口方式实现多线程,原因主要有: Java单一继承机制,如果线程类继承了 Thread类,就不能继承其他类。 实现 Runnable接口的线程可以共享同一资源,例如:演示启动多个线程共享同一资源多线程实例 售票系统public void run() throws InterruptedException while(true) if (tickets = 0) return;Thread.sleep(1000); /利用线程休眠模拟卖票的时间System.out.println(Thread.currentThread().getName() + “(“ + tickets- + “)“);存在问题:当卖最后一张票时,多个线程由于时间片轮换有可能均执行到输出语句,因此,出现卖出第 0、 -1、 -2张票的现象。演示实现多线程售票系统存在问题线程的同步l 为了解决资源共享问题,使用加锁机制,即每一时刻只能有一个线程对共享资源进行读写,就像上了一把锁,只有拥有钥匙的线程才能访问。当线程不再访问共享资源时,再把钥匙交出,由其它想访问该资源的线程竞争访问权。这种对共享资源加以控制的方法,称为同步。l Java语言为了解决同步问题,提供了一个关键字 synchronized。这个关键字有两种使用方式:程序块同步和对方法同步。演示线程同步线程间通信l 线程间的通信机制, Java线程之间通信是通过wait( )、 notify( )以及 notifyAll( )来实现的。方法 说明wait( ) 告诉当前线程放弃同步锁并进入睡眠状态(进入等待队列),直到其他线程进入同一个同步锁并调用 notify为止。notify( ) 将从该同步锁的等待队列中删除一个任意选择的线程,这个线程将再次成为可运行的线程。notifyAll( ) 将从该同步锁的等待队列中删除所有等待的线程, 这些线程将成为可运行的线程。生产者与消费者问题l 【 例 9.6】 生产中消费者问题对线程间通信做具体的介绍。系统由生产者线程、消费者线程以及一个共享缓冲区组成,其中: 1. 生产者不断写入,直到共享缓冲区满为止,一旦共享缓冲区有空间,生产者继续写入; 2. 消费者不断读出,直到共享缓冲区为空,一旦共享缓冲区有内容,消费者继续读出; 3. 共享缓冲器内部空间为 N(本例设 N=1),任一时刻只能有一个线程对缓冲区操作。演示线程间通信线程的终止l 正常退出 一般在写线程体 run( )方法的时候,提倡使用无限循环的方式,然后在循环内部通过一个 boolean型标记控制循环的停止。l 外部中断线程 当线程使用了 sleep( )方法或者因为某些方法如 wait( )方法的调用而进入阻塞状态,不能自己中断,此时又需要中断该线程,这是可以使用 Thread类中的interrupt( )方法使线程中断,但程序会抛出InterruptedException异常。使用 Executors创建线程池l Java从 1.5版本开始提供 Executor。 Executor是一个接口,实现此接口的子类作为一个辅助类,能够执行已提交的具有 Runnable接口的任务对象。该接口为线程提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方法。l 接口 ExecutorService继承了 Executor,是一个使用更加广泛的接口。l 为了获得一个 ExecutorService类型的实例,需要使用 Executors工厂类。使用 Executors创建线程池l 【 例 9.7】 修改例 9.6生产者消费者问题,利用Executors建立一个线程池并启动多个线程。为了实现本例,首先需要已经实现 Runnable接口的线程体,例 9.6中的 Producer和Consumer已经符合要求,只需要修改 Main,利用 Executors来启动多个线程即可。import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class Main public static void main(String args) /建立线程池ExecutorService exec = Executors.newCachedThreadPool( ); Queue q =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论