【php精品源码栏目提醒】:网学会员为广大网友收集整理了,第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 MyThreadClassmyThread.starttry myThread.sleep10000 catch InterruptedException e 对于这四种使得线程处于不可运行状态的情况,都有特定的方法使线程返回可运行状态: 如果线程处于休眠状态中,sleep方法中的参数为休眠时间,当这个时间过去后,线程即为可运行的; 如果线程在等待条件变量,那么要停止等待的话,需要该条件变量所在的对象调用 notify或 notifyAll方法 如果在 I/O 流中发生线程阻塞,则特定的 I/O 指令将结束这种不可运行状态。
需要注意的是每种方法都仅仅对相应的状态才有作用,例如当一个线程休眠并且休眠时间还没有结束 时,调用其他方法是无效的,并且还会引起非法状态异常。
死亡状态Dead线程的终止一般可通过两种方法实现:自然撤消或强行终止。
自然撤消是指从线程的 run 方法正常结束退出,如果希望线程正常终止,一般可使用某种手段来使 线程中的 run方法结束执行。
调用线程的实例方法 stop 则可以强制停止当前线程。
既可以在其他线程中调用该线程的 stop方 法来终止,也可以由线程自己调用 stop方法,自我终止。
但这个方法已在 JDK2 中建议不再使用, 应当避免使用。
8.1.5 线程的优先级每个线程各自任务的重要程度不同而可能有不同的优先级。
Java 提供一个线程调度器来监控程序中进入就绪状态的所有线程。
线程调度器按照线程的优先级决定调度线程的执行。
多个线程运行时,具有高优先级的线程会在较低优先级的线程之前得到执行。
线程的调度是抢先式的,一个具有更高优先级的线程进入可执行状态,则该高优先级的线程会被立即 调度执行。
同一优先级的线程,采取先进先出的原则由操作系统按时间片轮转方式或独占方式来分配线程的执行 时间。
线程的优先级用数字来表示,范围从 1 到 10,Thread 类有三个关于优先级的静态常量: MIN_PRIORITY1 MAX_ PRIORITY10 NORM_ PRIORITY5对应于一个新线程,系统会遵循以下原则: 新线程将继承创建它的父线程的优先级。
一般情况下,线程具有普通优先级。
用户可以根据需要,通过 setPriority方法来修改优先级。
8.1.6 线程的主要方法Tread 类综合了 Java 程序中一个线程所需要拥有的属性和方法,主要有:public ThreadRunnable target String nametarget 是线程体 run方法所在的对象;name 是线程的名称。
target 必须实现接口 Runnable。
在接口 Runnable 中只定义了一个方法 void run作为线程体。
任 何实现接口 Runnable 的对象都可以作为一个线程的目标对象。
start方法:启动线程,使线程由新建状态转为就绪状态;run方法:定义该线程的操作,run方法比较特殊,它可以被系统自动识别并执行。
sleep 方 法 : 使 线 程 进 入 到 休 眠 状 态 。
让 其 它 线 程 得 到 机 会 执 行 。
sleep 会 抛 出 异 常InterruptedException ,必须捕获。
isAlive方法:可以用来判断线程目前是否正在执行状态中。
如果线程已被启动并且未被终止,那么isAlive 返回 true,但该线程是可运行或是不可运行的,需要作进一步的判断。
如果返回 false,则该线程是新创建或是已被终止的同样也需要作进一步的判断。
join方法:等待另一个线程终止,即接着另一个线程执行。
yield方法:将执行的权力交给其它优先级相同的线程,自己到可运行线程队列的最后等待,若队列空,该方法无效。
8.2 线程的使用方法Java 中编程实现多线程有两种方式: 由 Thread 类派生子类创建线程类; 通过实现 Runnable 接口创建线程类。
两种方法都要使用到 Java.lang 中的 Thread 类及其方法来实现。
当生成一个 Thread 对象之后,就产生了一个线程,通过该对象,可以启动线程、终止线程、或者暂时休眠等。
Thread 类本身只是线程的虚拟 CPU,线程所执行的代码或者说线程所要完成的功能是通过方法 run来完成的,run方法称为线程体。
在一个线程被建立并初始化以后,Java 的运行时系统就自动调用 run 方法,完成线程要达到的目标。
8.2.1 通过继承 Thread 类构造线程线程的创建与启动通过继承 Thread 类
上一篇:
【精品】在VC中调用 WebService
下一篇:
应用数学学报编辑部联系方式