Java 2实用教程(第三版)Java多线程机制和输入输出流ppt

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

try {
} catch (IOException e ) { System.out.println("File read error: " +e ); //文件I/O错误 }
从输入流中读取字节
9.11 守护线程
9.1 Java中的线程


程序是一段静态的代码,它是应用软件执行的蓝本。 进程是程序的一次动态执行过程,它对应了从代码加 载、执行至执行完毕的一个完整过程,这个过程也是 进程本身从产生、发展至消亡的过程。线程是比进程 更小的执行单位,一个进程在其执行过程中,可以产生 多个线程,形成多条执行线索,每条线索,即每个线 程也有它自身的产生、存在和消亡的过程,也是一个 动态的概念。 Java的多线程就是在操作系统每次分时给Java程序一 个时间片的CPU时间内,在若干个独立的可控制的线 程之间切换。
9.11守护线程


程序中的所有用户线程都已结束运行时,即使 守护线程的run方法中还有需要执行的语句, 守护线程也立刻结束运行。我们可以用守护线 程做一些不是很严格的工作,线程的随时结束 不会产生什么不良的后果。 一个线程调用 void setDaemon(boolean on) 方法可以将自己设置成一个守护(Daemon) 线程,线程必须在运行之前设置自己是否是守护 线程 .
actionPerformed(Actionevent e)。

使用Timer类的start()方法启动计时器,即启动线程。 使用stop()方法停止计时器,即挂起线程,使用 restart()方法重新启动计时器,即恢复线程 .
9.10线程联合


一个线程A在占有CUP资源期间,可以让 其它线程调用join()和本线程联合 . 如果线程A在占有CUP资源期间一旦联合 B线程,那么A线程将立刻中断执行,一 直等到它联合的线程B执行完毕,A线程 再重新排队等待CUP资源,以便恢复执行。
10.7 数据流 10.8 数组流 10.9 对象流 10.10 序列化与对象克隆 10.11 文件锁FileLock 10.12 Process 类中的流 10.13 带进度条的输入流
I/O流


I/O流提供一条通道程序,可以使用这条通道把源中的 字节序列送给目的地。把输入流的指向称做源,程序 从指向源的输入流中读取源中的数据。而输出流的指 向是字节要去的一个目的地(或用户),程序通过向输出 流中写入数据把信息传递到目的地。虽然I/O流经常与 磁盘文件存取有关,但是程序的源和目的地也可以是键 盘、鼠标、内存或显示器窗口。 Java的I/O流库提供大量的流类(在包java.io中)。但是, 所有输入流类都是抽象类InputStream(字节输入流) 或抽象类Reader(字符输入流)的子类,而所有输出 流都是抽象类OutputStream(字节输出流)或抽象类 Writer(字符输出流)的子类。
4.isAlive()


线程处于“新建”状态时,线程调用isAlive() 方法返回false。当一个线程调用start()方法, 并占有CUP资源后,该线程的run方法就开始运 行,在线程的run方法结束之前,即没有进入 死亡状态之前,线程调用isAlive()方法返回true。 当线程进入“死亡”状态后(实体内存被释 放),线程仍可以调用方法isAlive(),这时 返回的值是false。 一个已经运行的线程在没有进入死亡状态时, 不要再给线程分配实体,由于线程只能引用最 后分配的实体,先前的实体就会成为“垃圾”, 并且不会被垃圾收集机收集掉 .
第9章 Java多线程机制

9.1 Java中的线程 9.2 Thread的子类创建线程 9.3 使用Runable接口 9.4 线程的常用方法 9.5 GUI线程 9.6 线程同步 9.7 在同步方法中使用wait()、notify 和notifyAll()方法 9.8 挂起、恢复和终止线程 9.9 计时器线程Timer 9.10 线程联合
3.sleep(int millsecond)

现程占有CPU期间,执行sleep方法来使 自己放弃CPU资源,休眠一段时间。休眠 时间的长短由sleep方法的参数决定, millsecond是毫秒为单位的休眠时间。如 果线程在休眠时被打断,JVM就抛出 InterruptedException异常。因此,必须 在try~catch语句块中调用sleep方法。
5.currentThread()

currentThread()方法是Thread类中的 类方法,可以用类名调用,该方法返回 当前正在使用CPU资源的线程。
6.interrupt()

intertupt方法经常用来“吵醒”休眠的 线程。当一些线程调用sleep方法处于休 眠状态时,一个占有CPU资源的线程可以 让休眠的线程调用interrupt 方法“吵醒” 自己 .
启动线程

线程创建后仅仅是占有了内存资源,在 JVM管理的线程中还没有这个线程,此线 程必须调用start()方法(从父类继承 的方法)通知JVM,这样JVM就会知道又 有一个新一个线程排队等候切换了。
9.2 Thread的子类创建线程


用Thread类或子类创建线程对象 . 编写Thread类的子类时,需要重写父类 的run方法,其目的是规定线程的具体操 作,否则线程就什么也不做,因为父类 的run方法中没有任何操作语句。 当JVM将CPU使用权切换给线程时,如果 线程是Thread的子类创建的,该类中的 run方法就立刻执行。
9.8挂起、恢复和终止线程


挂起 有时候两个线程并不是同步的,即不涉及都需要 调用一个同步方法,但线程也可能需要暂时的挂起。 所谓挂起一个线程就是让线程暂时让出CPU的使用权 限,暂时停止执行,但停止执行的持续时间不确定, 因此不能使用sleep方法暂停线程。挂起一个线程需使 用wait方法,即让准备挂起的线程调用 wait 方法,主 动让出CPU的使用权限. 恢复 为了恢复该线程,其它线程在占有CUP资源期间, 让挂起的线程的目标对象执行notifyAll()方法,使得挂 起的线程继续执行;如果线程没有目标对象,为了恢 复该线程,其它线程在占有CUP资源期间,让挂起的 线程调用notifyAll()方法,使挂起的线程继续执行。
9.6线程同步


线程同步问题 线程同步是指几个线程都需要调用一个同 步方法(使用关键字synchronized修饰的方 法) . 同步机制 当一个线程A使用一个synchronized修饰的方法 时,其他线程想使用这个方法时就必须等待, 直到线程A 使用完该方法 (除非线程A使用 wait主动让出CUP资源).
10.2 FileInputStream类

使用文件输入流构造方法建立通往文件的输入流时, 可能会出现错误(也被称为异常)。为了把一个文件 输入流对象与一个文件关联起来,使用类似于下面所 示的代码:
FileInputStream ins = new FileInputStream("myfile.dat");
9.9计时器线程Timer



使用Timer类的构造方法:Timer(int a, Object b)创建 一个计时器 . 参数a的单位是豪秒,确定计时器每隔a 毫秒"震铃"一 次,参数b是计时器的监视器。计时器发生的震铃事件 是ActinEvent 类型事件. 当震铃事件发生时,监视器就会监视到这个事件,就 会执行接口ActionListener中的方法:
第10章 输入输出流


10.1 File类 10.2 FileInputStream类 10.3 FileOutputStream类 10.4 FileReader类和FileWriter类 10.5 使用文件对话框打开和保存文 件 10.6 RandomAccessFile类

9.5 GUI线程

程序包含图形用户界面(GUI)时,Java 虚拟机在运行应用程序时会自动启动更 多的线程,其中有两个重要的线程: AWT-EventQuecue和AWT-Windows。 AWT-EventQuecue-()线程负责处理GUI 事件,AWT-Windows线程负责将窗体或 组件绘制到桌面。
9.4线程的常用方法
1.start() 线程调用该方法将启动线程,使之从新 建状态进入就绪队列排队,一旦轮到它 来享用CPU资源时,就可以脱离创建它的 线程独立开始自己的生命周期了。

2.run()

Thread类的run()方法与Runnable接口中 的run()方法的功能和作用相同,都用来 定义线程对象被调度之后所执行的操作, 都是系统自动调用而用户程序不得引用 的方法。系统的Thread类中,run()方法 没有具体内容,所以用户程序需要创建 自己的Thread类的子类,并重写run()方 法来覆盖原来的run()方法。当run方法执 行完毕,线程就变成死亡状态。
9.3使用Runable接口


创建线程的另一个途径就是用Thread类直接创 建线程对象。使用Thread创建线程对象时,通 常使用的构造方法是: Thread(Runnable target) 该构造方法中的参数是一个Runnable类型的接 口,因此,在创建线程对象时必须向构造方法 的参数传递一个实现Runnable接口类的实例, 该实例对象称作所创线程的பைடு நூலகம்标对象. 当线程调用start方法后,一旦轮到它来享用 CPU资源,目标对象就会自动调用接口中的run 方法(接口回调) .
9.7在同步方法中使用wait()、 notify 和notifyAll()方法

等待与通知 一个线程在使用的同步方法中时, 可能根据问题的需要,必须使用wait()方 法使本线程等待,暂时让出CPU的使用权, 并允许其它线程使用这个同步方法。其 它线程如果在使用这个同步方法时如果 不需要等待,那么它用完这个同步方法 的同时,应当执行notifyAll()方法通知所 有的由于使用这个同步方法而处于等待 的线程结束等待。
2.线程的状态与生命周期




新建 当一个Thread类或其子类的对象被声明并创建 时,新生的线程对象处于新建状态。此时它已经有了 相应的内存空间和其他资源。 运行 线程创建之后就具备了运行的条件,一旦轮到 它来享用CPU资源时,即JVM将CPU使用权切换给该线 程时,此线程的就可以脱离创建它的主线程独立开始 自己的生命周期了(即run方法执行的过程)。 中断 有4种原因的中断:CPU资源从当前线程切换给 其他线程、执行了sleep(int millsecond)方法、执行了 wait()方法、进入阻塞状态 。 死亡 run方法结束 。
10.1 File类


File类的对象主要用来获取文件本身的一些信 息,例如文件所在的目录、文件的长度、文件 读写权限等,不涉及对文件的读写操作 构造方法有3个: File(String filename); File(String directoryPath,String filename); File(File f, String filename);

每个Java程序都有一个缺省的主线程。我们已 经知道, Java应用程序总是从主类的main方法 开始执行。当JVM加载代码,发现main方法之 后,就会启动一个线程,这个线程称作“主线 程”,该线程负责执行main方法。那么,在 main方法的执行中再创建的线程,就称为程序 中的其它线程。如果main方法中没有创建其他 的线程,那么当main方法执行完最后一个语句, 即main方法返回时,JVM就会结束我们的Java 应用程序。如果main方法中又创建了其他线程, 那么JVM就要在主线程和其他线程之间轮流切 换,保证每个线程都有机会使用CPU资源, main方法即使执行完最后的语句,JVM也不会 结束我们的程序,JVM一直要等到程序中的所 有线程都结束之后,才结束我们的Java应用程 序
相关文档
最新文档