您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > AI人工智能 > Java程序设计语言线程
ITEducation&TrainingDate:19June2008Java程序设计语言SL-275(五)ITEducation&TrainingDate:19June2008今天的议题•线程•高级I/O流•网络连接ITEducation&TrainingDate:19June2008第13章线程ITEducation&TrainingDate:19June2008本章概述•线程是一个复杂的主题;本章将解释有关Java编程语言的线程处理,并将介绍线程通讯与同步的简单示例。ITEducation&TrainingDate:19June2008线程¾线程是什么?•虚拟CPU¾java.lang.Thread类可以创建和控制线程。ITEducation&TrainingDate:19June2008线程的三个部分¾一个线程由三个主要部分构成:•一个虚拟CPU•该CPU要执行的代码•代码操作的数据ITEducation&TrainingDate:19June2008创建线程•示例程序ThreadTester.java,说明如何创建一个线程,以及如何使用构造器参数在线程运行时为它提供代码和数据。ITEducation&TrainingDate:19June2008创建线程¾多线程编程:•多线程源于同一个Runnable实例•线程共享同样的数据和代码¾示例:Threadt1=newThread(r);Threadt2=newThread(r);ITEducation&TrainingDate:19June2008创建线程ITEducation&TrainingDate:19June2008启动线程•使用start方法•使线程处于可以运行的状态,但不一定意味着该线程立即开始运行。ITEducation&TrainingDate:19June2008线程调度•在Java技术中,线程通常是抢先式。•一个Thread对象在它的整个生存期中能以几种不同的状态存在。ITEducation&TrainingDate:19June2008线程调度•通过Thread类中的静态方法sleep实现线程调度。ITEducation&TrainingDate:19June2008线程的基本控制¾终止线程•一个线程完成执行并且终止后,不能再次运行。•可通过使用一个标志指示run方法退出,从而终止线程。ITEducation&TrainingDate:19June2008终止线程ITEducation&TrainingDate:19June2008当前线程的引用¾在具体的代码段内,使用Thread类的静态方法currentThread可得到当前线程的一个引用。ITEducation&TrainingDate:19June2008线程的基本控制¾测试线程:•isAlive()¾访问线程优先级:•getPriority()•setPriority()¾使线程保持:•Thread.sleep()•join()•Thread.yield()ITEducation&TrainingDate:19June2008测试线程•线程可处于未知的状态。•使用方法isAlive来确定一个线程是否活动。•“活动的”(Alive)不表示线程正在运行;该方法返回为true时表示线程已启动但尚未完成自己的任务。ITEducation&TrainingDate:19June2008访问线程优先级¾使用getPriority方法来确定线程的当前优先级。¾使用setPriority方法设置线程的优先级。¾优先级是整数值,Thread类包括常数:•Thread.MIN_PRIORITY•Thread.NORM_PRIORITY•Thread.MAX_PRIORITYITEducation&TrainingDate:19June2008使线程保持¾Thread.sleep()方法•sleep方法是一种让线程中止一段时间的方法。在睡眠期满的瞬间,再次调用该线程不一定会恢复它的执行,除非:9“正在醒来”的线程有更高的优先级9正在运行的线程由于某些其他原因而阻塞ITEducation&TrainingDate:19June2008使线程保持•join方法导致当前线程等待,直到调用这个join方法的线程终止。ITEducation&TrainingDate:19June2008使线程保持•Thread.yield()方法可为其他可运行的线程提供执行机会。•如果其他线程是可运行的,yield将正在调用的线程放进可运行缓冲池中,然后使另一个可运行的线程运行。•如果没有其他可运行的线程,则yield不做任何事情。ITEducation&TrainingDate:19June2008创建线程的其他方法•可通过创建Thread类的子类来创建一个线程,而不用实现Runnable接口。ITEducation&TrainingDate:19June2008选择创建线程的方法¾实现Runnable:•更好的面向对象设计•单继承•一致性¾继承Thread:•代码更简洁ITEducation&TrainingDate:19June2008Java中的synchronized关键字•synchronized关键字为Java编程语言提供了一种机制,使程序员能够控制共享数据的各线程。ITEducation&TrainingDate:19June2008对象的锁标志•每个对象都有一个锁标志,可以将其看作“锁标志”。•synchronized允许同锁标志交互。ITEducation&TrainingDate:19June2008对象的锁标志ITEducation&TrainingDate:19June2008对象的锁标志ITEducation&TrainingDate:19June2008释放锁标志•当线程执行到synchronized代码块结束时,释放锁标志。•当在synchronized代码块中遇到中断、返回或异常时,自动释放。ITEducation&TrainingDate:19June2008synchronized-整合到一起•对敏感数据的所有访问都应该是synchronized。•synchronized保护的敏感数据应该是private。ITEducation&TrainingDate:19June2008synchronized-整合到一起•方法中的全部代码都属于this实例的同步块时,可以把synchronized关键字放在它的开始部分。ITEducation&TrainingDate:19June2008线程状态•同步是一种特殊的线程状态。ITEducation&TrainingDate:19June2008线程交互-wait和notify¾方案:•把自己和一辆出租车司机作为两个线程¾问题:•怎样确定什么时候到达目的地¾解答•告诉出租车司机(目的地),然后休息•出租汽车司机驾驶,到达目的地后告知ITEducation&TrainingDate:19June2008线程交互¾wait和notify¾池•等待池•锁池ITEducation&TrainingDate:19June2008线程状态•“等待池”也是一种特殊的线程状态。ITEducation&TrainingDate:19June2008整合-线程交互的示例•生产商:Producer.java•消费者:Consumer.java•堆栈类:SyncStack.java•测试类:SyncTest.javaITEducation&TrainingDate:19June2008第14章高级I/O流ITEducation&TrainingDate:19June2008本章概述•本章学习Java编程语言如何使用流来处理字节、字符和对象的I/O。此外,还描述了节点流和处理流。ITEducation&TrainingDate:19June2008I/O基本原理•流是从来源到接收的数据流。•来源流发起数据流,也称为输入流。•接收流终止数据流,也称为输出流。•来源流和接收流都是节点流。•有三种类型的节点流:文件、内存和线程或进程之间的管道。ITEducation&TrainingDate:19June2008I/O基本原理•基本的流类节点流字符流来源流InputStreamReader接收流OutputStreamWriterITEducation&TrainingDate:19June2008流中的数据¾Java技术支持流中的两种类型的数据:字符和字节。¾字符数据的输入和输出通过阅读器和书写器处理。¾字节数据的输入和输出通过输入流和输出流处理。•通常,术语流指字节流。•术语阅读器和书写器指字符流。ITEducation&TrainingDate:19June2008流中的数据•字符输入流由Reader类的子类实现。•字符输出流由Writer类的子类实现。•字节输入流由InputStream类的子类实现。•字节输出流由OutputStream类的子类实现。ITEducation&TrainingDate:19June2008InputStream方法•三种基本read方法:•其他方法:intread()intread(byte[]buffer)intread(byte[]bufffer,intoffset,intlength)voidclose()intavailable()skip(longn)booleanmarkSupported()voidmark(intreadlimit)voidreset()ITEducation&TrainingDate:19June2008OutputStream方法•三种基本write方法:•其他方法:voidwrite(intc)voidwrite(byte[]buffer)voidwrite(byte[]buffer,intoffset,intlength)voidclose()voidflush()ITEducation&TrainingDate:19June2008Reader方法•三种基本read方法:•其他方法:intread()intread(char[]cbuf)intread(char[]cbuf,intoffset,intlength)voidclose()booleanready()skip(longn)booleanmarkSupported()voidmark(intreadAheadLimit)voidreset()ITEducation&TrainingDate:19June2008Writer方法•基本write方法:•其他方法:voidwrite(intc)voidwrite(char[]cbuf)voidwrite(char[]cbuf,intoffset,intlength)voidwrite(Stringstr)voidwrite(Stringstr,intoffset,intlength)voidclose()voidflush()ITEducation&TrainingDate:19June2008节点流•节点流的类型类型字符流字节流文件FileReaderFileWriterFileInputStreamFileOutputStream内存:数组CharArrayReaderCharArrayWriterByteArrayInputStreamByteArrayOutputStream内存:字符串StringReaderStringWriter管道PipedReaderPipedWriterPipedInputStreamPipedOutputStreamITEducation&TrainingDate:19June2008阅读器/书写器举例•示例程序TestNodeStreams.java从第一个命令行参数命名的文件读取字符,并将这些字符写入第二个命令行参数命名的文件,即进行文件复制。IT
本文标题:Java程序设计语言线程
链接地址:https://www.777doc.com/doc-4526432 .html