欢迎来到天天文库
浏览记录
ID:50208774
大小:605.50 KB
页数:86页
时间:2020-03-10
《网络编程与计算技术 教学课件 作者 刘化君 第7章 多线程与非阻塞通信.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、2021年10月5日第7章多线程与非阻塞通信多线程程序设计比传统的顺序程序设计要复杂的多,程序的调试也更为困难一些。本章将主要讨论线程及其创建方法、线程的基本控制与调度、线程同步、线程间通信、使用管道进行线程通信、线程池以及多线程网络应用程序设计示例等。最后,讨论用于支持非阻塞通信的SocketChannel、ServerSocketChannel类,以提供对构建高性能服务器的支持。7.1Java中的多线程多线程编程技术是Java网络编程的重要内容。在网络编程中经过分析可以发现,很多功能都是需要并发执行的。可以用几个不同的独立线程去完成不
2、同的任务。在讨论Java中的多线程网络程序设计之前,先介绍一些与线程有关的操作系统知识。7.1.1程序、进程与线程通常所说的程序是指用编辑软件编写好的一段静态代码(如.java文件),它是应用软件执行的蓝本;经过编译之后变成字节码文件(如.class文件)。这两种类型的文件都是保存在磁盘中的,把它们称作“程序(program)”。当用JVM来运行class文件时,计算机会从磁盘中把程序代码加载到内存中运行,这时就把运行中的程序称为“进程(process)”。进程对应了从代码加载、执行到执行完毕的一个完整过程。线程与进程相似,线程是比进程更
3、小的执行单位;是一段完成某个特定功能的代码。一个线程是一个程序内部的顺序控制流。但与进程不同的是,同类的多个线程共享一块内存空间和一组系统资源,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。所以系统在产生一个线程或者在各个线程之间切换时,负担要比进程小的多,正因如此,线程被称为轻负荷进程(light-weightprocess)。一个进程中可以包含多个线程。Java程序通过流控制来执行程序流,因此把程序中单个顺序的流控制称为线程。多线程则指的是在单个程序中可以同时运行多个不同的线程,执行不同的任务。多线程意味着在一个应用程
4、序中,有多个顺序流同时执行。多线程是相对于单线程而言的,普通的DOS和早期的Windows操作系统都采用单线程程序结构,其工作原理是:主程序有一个主消息循环队列,它不断从消息队列中读入消息来决定下一步所要做的工作,一般是一个子函数,只有等这个子函数执行完它的任务返回后,主程序才能接收另外的消息来执行其他任务。例如,若某子函数的功能是在读一个网络数据,或是读一个文件,则只有等待读完这些数据或文件才能接收下一个消息。计算机的CPU除了执行着一个子函数过程外,不做其他任何事情。这样,在读取网络数据或等待用户输入时,往往会使计算机的CPU有很多时
5、间处于等待状态。多线程编程机制利用这一特点,将一个大任务(进程)分成多个并发小任务(线程),使CPU无需等待地执行每一个小任务,完成多任务的“同时”处理,解决了CPU时间的浪费问题。为了实现多任务处理,Java语言提供了较完善的多线程处理机制,所以,在Java语言中实现多线程相当方便。一些动态效果(动画、动态字幕等)常常利用多线程技术来实现。每一个Java程序都有一个默认的主线程。Java应用程序总是从主类的main()方法开始执行。当JVM加载代码,发现main()方法之后,就会启动一个线程,这个线程称为“主线程”,该线程负责执行mai
6、n()方法。在main()方法的执行过程中再创建的线程,称为程序中其他线程。如果main()方法中创建了其他的线程,那么JVM就要在主线程和其他线程之间轮流切换,让主线程与其他线程轮流执行,保证每个线程都有机会使用CPU资源,main()方法即使执行完最后的语句,JVM也不会结束程序,要等到程序中的所有线程都结束后,才结束Java应用程序,如图7-1所示。应用程序主线程线程1线程2Java虚拟机(JVM)JVM让主线程与其他线程轮流执行7.1.2Java多线程类和接口Java的线程是通过java.lang.Thread类来实现的。当生成一
7、个Thread类的对象之后,一个新的线程就产生了。该线程实例表示Java解释器中真正的线程,通过它可以启动线程、终止线程、线程挂起等。每个线程都是通过类Thread在Java的软件包Java.lang中定义的,其构造函数为:publicThread(ThreadGroupgroup,Runnabletarget,Stringname);其中,group指明该线程所属的线程组;target为实际执行线程体的目标对象,它必须实现接口Runnable;name为线程名。Java中的每个线程都有自己的名称,Java提供了不同Thread类构造函数
8、,允许给线程指定名称。如果name为null时,则Java自动提供惟一的名称。当上述构造函数的某个参数为null时,可得到如表7-1所列出的一些常用构造函数。可以通过两种方法实现线程体。1)定
此文档下载收益归作者所有