- 1、本文档共15页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第8章多线程与异常处理
第8章 多线程与异常处理
8.1 多线程的基本概念
8.1.1 多任务
多任务
多任务是计算机操作系统同时运行几个程序或任务的能力。现代操作系统都支持多任务,多任务有两种形式:
基于进程的多任务
基于线程的多任务
程序、进程和线程
程序是一段静态的代码,它是应用程序执行的蓝本。
进程是程序的一次动态执行过程,它对应了从代码加载、执行到执行完毕的一个完整过程。程序可以被多次加载到系统的不同内存区域分别执行,形成不同的进程。
线程是进程内部的一个顺序执行控制流。 一个进程在执行过程中,可以产生多个线程同时执行。每个线程也有自己产生、存在和消亡的过程。
8.1.2 线程与多线程
线程和进程的区别:
从逻辑的观点来看,多线程意味着一个程序的多行语句同时执行,但是多线程并不等于多次启动一个程序,操作系统也不会把每个线程当作独立的进程来对待。
两者的层次不同,进程是由操作系统来管理的,而线程则是在一个程序(进程)内部存在的。
不同进程的代码、内部数据和状态都是完全独立的,进程之间进行切换和通信的开销很大。
线程本身的数据通常只有寄存器数据以及程序执行时使用的堆栈,一个程序内的多个线程是共享同一内存空间和系统资源,线程的切换开销小,线程之间的通信很容易。
8.1.3 Java对多线程的支持
对多线程的综合支持是Java语言的一个重要特色,它提供了Thread类来实现多线程。在Java中,线程可以认为是由三部分组成的:
虚拟CPU,封装在java.lang.Thread类中,它控制着整个线程的运行;
执行代码,传递给Thread类,由Thread类控制顺序执行;
处理的数据,传递给Thread类,是在代码执行过程中所要处理的数据。
8.1.4 线程的状态
每个Java程序都有一个缺省的主线程,对于Application,主线程是执行main()方法的线程;对于Applet,主线程是通过浏览器加载并执行Java小程序的线程。
多线程应用的实质就是在主线程之外,定义了一个或多个新的线程。
Java使用Thread类及其子类表示线程。一个线程的生命周期中,线程的状态表示了线程正在进行的活动以及在这段时间内线程能完成的任务。
新建状态(Newborn)
当创建了一个新的线程对象时,它就处于新建状态,此时它仅仅是一个空的线程对象,系统不为它分配资源。处于这种状态时只能启动Start()或终止Stop()该线程,调用除这两种以外的其它方法都会失败并且会引起非法状态异常IllegalThreadStateException(对于其它状态,若所调用的方法与状态不符,都会引起非法状态异常)。
就绪状态(Runnable)
当线程处于新建状态时,可以调用start()方法来启动它,产生运行这个线程所需的系统资源,安排其运行,并调用线程体run()方法,这样该线程就处于就绪( Runnable )状态。
这一状态并不是运行状态(Running ),因为线程也许实际上并未真正运行。由于很多计算机都是单处理器的,所以要在同一时刻运行所有的处于就绪状态的线程是不可能的,Java运行系统必须通过调度来保证这些线程共享处理器。
阻塞状态(Blocked)
线程处于可运行状态时,当下面四种情况发生,线程就进入不可运行状态:
调用了休眠方法sleep( )yield() 方法;
调用了挂起方法suspend( )
为等候一个条件变量,线程调用等待方法wait()
输入输出流中发生线程阻塞。
Thread myThread = new MyThreadClass();
myThread.start();
try{
myThread.sleep(10000);
} catch (InterruptedException e){ }
如果线程处于休眠状态中,sleep()方法中的参数为休眠时间,当这个时间过去后,线程即为可运行的;
如果线程在等待条件变量,那么要停止等待的话,需要该条件变量所在的对象调用notify()或notifyAll()方法;
如果在I/O流中发生线程阻塞,则特定的I/O指令将结束这种不可运行状态。
需要注意的是每种方法都仅仅对相应的状态才有作用,例如当一个线程休眠并且休眠时间还没有结束时,调用其他方法是无效的,并且还会引起非法状态异常。
死亡状态(Dead)
线程的终止一般可通过两种方法实现:自然撤消或强行终止。
自然撤消是指从线程的run( )方法正常结束退出,如果希望线程正常终止,一般可使用某种手段来使线程中的run()方法结束执行。
调用线程的实例方法stop( )则可以强制停止当前线程。既可以在其他线程中调用该线程的stop()方法来终止,也可以由线程自己调用stop()方法,自我终止。但这个方法已在JDK2中建议不再使
文档评论(0)