版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、12想象一下,假如我们想要从想象一下,假如我们想要从InternetInternet上下载一上下载一段很长的视频或者音频片段,假如我们可以把段很长的视频或者音频片段,假如我们可以把下载任务放在一个独立的线程里实现,我们在下载任务放在一个独立的线程里实现,我们在下载开场之后很快就可以观看这个片段了,而下载开场之后很快就可以观看这个片段了,而不是必须等全部下载完成才可以观看。不是必须等全部下载完成才可以观看。此外,多线程的执行还可以允许许多用户同时此外,多线程的执行还可以允许许多用户同时访问一个公共的数据库,这个特性对于类似库访问一个公共的数据库,这个特性对于
2、类似库存管理和机票预定这样的系统有时候显得非常存管理和机票预定这样的系统有时候显得非常有用。有用。为了防止由于多个用户同时读取和写入公共数为了防止由于多个用户同时读取和写入公共数据库而造成的数据破坏,多线程还需要在对象据库而造成的数据破坏,多线程还需要在对象上设置锁。这样一个时刻只有一个线程可以修上设置锁。这样一个时刻只有一个线程可以修改一个对象的状态。改一个对象的状态。 3如何理论对正在下载的视频进展同时观看;机票预订;并发的处理。4线程的概念线程的概念线程的调度线程的调度创立和启动线程创立和启动线程ThreadThread线程类、线程类、RunnableRunnable接口接口多个线程的同
3、步多个线程的同步线程之间的通信线程之间的通信5程序:程序:是一段静态的代码,它是应用程序执行的蓝本。是一段静态的代码,它是应用程序执行的蓝本。进程:进程:是程序的一次动态执行过程,它对应了从代码加是程序的一次动态执行过程,它对应了从代码加载、执行到执行完毕的一个完好过程,也是进程本身从载、执行到执行完毕的一个完好过程,也是进程本身从产生、开展至消亡的过程。产生、开展至消亡的过程。目前所流行的操作系统中,大部分都是支持多任务的目前所流行的操作系统中,大部分都是支持多任务的如如Windows 3.XWindows 3.X,Windows NTWindows NT,Windows 95Windows
4、 95,OS/2OS/2及及UNIXUNIX的的各个版本各个版本,这实际就是一种,这实际就是一种多进程多进程的概念的概念每一个任每一个任务就是一个务就是一个。线程:线程:比进程更小的执行单位。比进程更小的执行单位。一个进程在执行过程中,一个进程在执行过程中,为了同时完成多项操作,可以产生多个线程,形成多条为了同时完成多项操作,可以产生多个线程,形成多条执行线索。每个线程都有它自身的产生、存在和消亡的执行线索。每个线程都有它自身的产生、存在和消亡的过程。过程。6多进程多进程环境中每一个进程既包括其所要执行的指环境中每一个进程既包括其所要执行的指令令, , 也包括执行指令所需的任何系统资源也包括执
5、行指令所需的任何系统资源, , 如如CPUCPU、内存空间、内存空间、I/OI/O端口等端口等, ,不同进程所占用的系统资不同进程所占用的系统资源相对独立;源相对独立;线程是比进程单位更小的执行单位,多线程环境线程是比进程单位更小的执行单位,多线程环境中每一个线程都隶属于某一进程中每一个线程都隶属于某一进程, ,由进程触发执行由进程触发执行, ,在系统资源的使用上在系统资源的使用上, ,属于同一进程的所有线程共属于同一进程的所有线程共享该进程的系统资源;享该进程的系统资源;与进程不同的是线程本身即没有入口,也没有与进程不同的是线程本身即没有入口,也没有出口,其自身也不能独立运行,它栖身于某个出
6、口,其自身也不能独立运行,它栖身于某个进程之中,由进程启动运行,完成其任务后,进程之中,由进程启动运行,完成其任务后,自动终止,也可以由进程使之强迫终止。自动终止,也可以由进程使之强迫终止。7多线程程序设计:多线程程序设计:是指单个程序包含是指单个程序包含的多个线程。当多的多个线程。当多线程程序执行时,该程序对应的进程中就有多线程程序执行时,该程序对应的进程中就有多个控制流在同时执行,个控制流在同时执行,即具有并发执行的多个即具有并发执行的多个线程;线程;例如:例如:PV操作操作Web Server承受客户端的恳求问题承受客户端的恳求问题银行问题银行问题网络聊天网络聊天一对多一对多程序程序8一
7、个多线程的例子一个多线程的例子:Test.javaTest.java此程序创立两个线程,分别执行存取款操作,并规定此程序创立两个线程,分别执行存取款操作,并规定每次存款每次存款2500025000元,每次取款元,每次取款5000050000元。元。9进程、线程示意图进程、线程示意图 10由于线程在程序内部,多个线程共享一些系统的开销,由于线程在程序内部,多个线程共享一些系统的开销,而而线程本身的数据通常只有微处理器的存放器数据,以及一线程本身的数据通常只有微处理器的存放器数据,以及一个供程序执行时使用的堆栈。个供程序执行时使用的堆栈。 例如线程之间共享一样的内例如线程之间共享一样的内存单元存单
8、元代码和数据代码和数据,因此在线程间切换,不需要很大,因此在线程间切换,不需要很大的系统开销,的系统开销,所以线程之间的切换速度远远比进程之间快,所以线程之间的切换速度远远比进程之间快,线程之间的通信也比进程通信快的多。线程之间的通信也比进程通信快的多。多个线程轮流抢占多个线程轮流抢占CPUCPU资源而运行时,资源而运行时,从从微观微观上讲,一个时上讲,一个时间里只能有一个作业被执行,在间里只能有一个作业被执行,在宏观宏观上可使多个作业被同上可使多个作业被同时执行,即等同于要让多台计算机同时工作,时执行,即等同于要让多台计算机同时工作,使系统资源使系统资源特别是特别是CPUCPU的利用率得到进
9、步,从而可以进步整个程序的执的利用率得到进步,从而可以进步整个程序的执行效率。行效率。11Virtual CPUCodeDataThread txyz rclass xyz线程线程12 每一个进程就是一个应用程序。有自己的入口和出口。每一个进程就是一个应用程序。有自己的入口和出口。 多进程多进程环境中每一个进程既包括其所要执行的指令环境中每一个进程既包括其所要执行的指令, , 也包括也包括了执行指令所需的任何系统资源了执行指令所需的任何系统资源, , 如如CPUCPU、内存空间、内存空间、I/OI/O端端口等;口等; 不同进程所占用的系统资源相对独立。不同进程所占用的系统资源相对独立。 多个线
10、程可共同存在于一个应用程序中。多个线程可共同存在于一个应用程序中。 多线程多线程环境中每一个线程都环境中每一个线程都隶属于某一进程隶属于某一进程, ,由进程触发执由进程触发执行没有自己的入口和出口;行没有自己的入口和出口; 在系统资源的使用上在系统资源的使用上, ,属于同一进程的所有线程共享该进程属于同一进程的所有线程共享该进程的系统资源。的系统资源。线程之间切换的速度比进程切换要快得多线程之间切换的速度比进程切换要快得多。进程和线程的比较总结进程和线程的比较总结13线程的调度线程的调度1 1微观上,在一台只具有一个微观上,在一台只具有一个CPUCPU的机器上,的机器上,CPUCPU在同一在同
11、一时间只能分配给一个线程做一件事。时间只能分配给一个线程做一件事。当有多于一个的线程工作时,在当有多于一个的线程工作时,在JavaJava中,线程调度通中,线程调度通常是常是,。一旦一个线程获得执行权,这个线程将持续运行下去,一旦一个线程获得执行权,这个线程将持续运行下去,直到它运行完毕或因为某种原因此阻塞,或者有另一直到它运行完毕或因为某种原因此阻塞,或者有另一个高优先级线程就绪个高优先级线程就绪。14线程的调度线程的调度2 2所有被阻塞的线程按次序排列,组成一个阻塞队列。例所有被阻塞的线程按次序排列,组成一个阻塞队列。例如如: :因为需要等待一个较慢的外部设备,例如磁盘或用户。因为需要等待
12、一个较慢的外部设备,例如磁盘或用户。让处于运行状态的线程调用让处于运行状态的线程调用Thread.sleepThread.sleep方法。方法。让处于运行状态的线程调用另一个线程的让处于运行状态的线程调用另一个线程的joinjoin方方法。法。所有就绪但没有运行的线程那么根据其优先级排入一个所有就绪但没有运行的线程那么根据其优先级排入一个就绪队列。就绪队列。当当CPUCPU空闲时,假如就绪队列不空,就绪队列中第一个具空闲时,假如就绪队列不空,就绪队列中第一个具有最高优先级的线程将运行。有最高优先级的线程将运行。当一个线程被抢占而停顿运行时,它的运行态被改变并当一个线程被抢占而停顿运行时,它的运
13、行态被改变并放到就绪队列的队尾;放到就绪队列的队尾;一个被阻塞可能因为睡眠或等待一个被阻塞可能因为睡眠或等待I/OI/O设备的线程就绪设备的线程就绪后通常也放到就绪队列的队尾。后通常也放到就绪队列的队尾。15线程的调度是按:线程的调度是按:其优先级的上下顺序执行的;其优先级的上下顺序执行的;同样优先级的线程遵循同样优先级的线程遵循“先到先执行的原那么;先到先执行的原那么;线程优先级线程优先级:范围:范围 110 110 10 10 级。数值越大,级别越高级。数值越大,级别越高Thread Thread 类定义的类定义的 3 3 个常数:个常数:MIN_PRIORITY MIN_PRIORITY
14、 最低最低小小优先级值为优先级值为1 1MAX_PRIORITY MAX_PRIORITY 最高最高大大优先级值为优先级值为1010NORM_PRIORITY NORM_PRIORITY 默认优先级值为默认优先级值为5 5线程创立时,继承父线程的优先级。线程创立时,继承父线程的优先级。常用方法:常用方法:getPrioritygetPriority :获得线程的优先级:获得线程的优先级setPrioritysetPriority :设置线程的优先级:设置线程的优先级1.1.ThreadPri.javaThreadPri.java1617主线程主线程主线程主线程:mainmain 方法方法App
15、lication Application 应用程序应用程序每当用每当用javajava命令启动一个命令启动一个JavaJava虚拟机进程虚拟机进程 Application Application 应用程序,应用程序,JavaJava虚拟机就会虚拟机就会创立一个主线程,该线程从程序入口创立一个主线程,该线程从程序入口mainmain方方法开场执行。法开场执行。阅读器中加载的阅读器中加载的 Applet Applet 主类主类Applet Applet 小程序小程序多线程多线程:在主线程中创立在主线程中创立 Thread Thread 类或其子类类或其子类对象时,就创立了一个线程对象。对象时,就创
16、立了一个线程对象。ProgrammerProgrammer可以控制线程的启动、挂起与终止。可以控制线程的启动、挂起与终止。18public class Sample public void method1String str System.out.printlnstr; public void method2String str method1str; public static void mainString args Sample s=new Sample; s.method2hello; main()方法方法method1()方法方法method2()方法方法主线程的方法调用栈主线程的方
17、法调用栈当我们运行java Sample命令时,java虚拟时机给每个线程分配方方法调用栈,用于跟踪每个线程调用方法的信息,同时方法调用栈法调用栈,用于跟踪每个线程调用方法的信息,同时方法调用栈还用做线程的工作区,方法部分变量会存放到方法调用栈中还用做线程的工作区,方法部分变量会存放到方法调用栈中19在一个多线程运行环境中运行的线程可以有多种状态在一个多线程运行环境中运行的线程可以有多种状态, ,也也就是说一个线程在不同时刻会处于以下状态之一就是说一个线程在不同时刻会处于以下状态之一: :新建、就绪、运行、阻塞、终止;新建、就绪、运行、阻塞、终止; BlockedBlocked终止终止新生成新
18、生成一个线程一个线程RunnableRunnableRunningRunningstart()start()yield()yield()notify()notify()wait(),sleep(),join()wait(),sleep(),join()20新建新建:当一个:当一个 Thread Thread 类或其子类对象被创立时,新类或其子类对象被创立时,新产生的线程处于新建状态,此时它已经有了相应的内产生的线程处于新建状态,此时它已经有了相应的内存空间和其他资源。如:存空间和其他资源。如: Thread myThread=new Thread myThread=new MyThreadCl
19、assMyThreadClass ; ;就绪就绪:调用:调用 startstart 方法来启动处于新建状态的方法来启动处于新建状态的线程后,将进入线程队列排队等待线程后,将进入线程队列排队等待 CPU CPU 效劳,此时它效劳,此时它已经具备了运行的条件,已经具备了运行的条件,一旦轮到它来享用一旦轮到它来享用 CPU CPU 资源资源时,就可以脱离创立它的主线程,开场自己的生命周时,就可以脱离创立它的主线程,开场自己的生命周期。期。运行运行:当就绪状态的线程被调度并获得处理器资源时,:当就绪状态的线程被调度并获得处理器资源时,便进入运行状态。便进入运行状态。每一个每一个 Thread Thre
20、ad 类及其子类的对象类及其子类的对象都有一个重要的都有一个重要的 runrun 方法,当线程对象被调用方法,当线程对象被调用执行时,它将自动调用本对象的执行时,它将自动调用本对象的 runrun 方法,从方法,从第一句开场顺序执行。第一句开场顺序执行。RunRun 方法定义了这个线程方法定义了这个线程的操作和功能。的操作和功能。21阻塞:一个正在执行的线程暂停自己的执行而进入的阻塞:一个正在执行的线程暂停自己的执行而进入的状态。状态。引起线程由运行状态进入阻塞状态的可能情况:引起线程由运行状态进入阻塞状态的可能情况:该线程正在等待该线程正在等待 I/O I/O 操作的完成操作的完成调用了该线
21、程的调用了该线程的 sleepsleep 方法方法调用了调用了 waitwait 方法方法让处于运行状态的线程调用另一个线程的让处于运行状态的线程调用另一个线程的joinjoin方法方法22对应于不同进入阻塞状态的情况,采取不同的方对应于不同进入阻塞状态的情况,采取不同的方法使其回到就绪状态:法使其回到就绪状态:I/O I/O 操作:等待这个操作:等待这个 I/O I/O 操作完成后;操作完成后;sleepsleep 方法:等待其指定的休眠事件完毕方法:等待其指定的休眠事件完毕后,自动脱离阻塞状态;后,自动脱离阻塞状态;调用调用 waitwait 方法:调用方法:调用 notifynotify
22、 或或 notifyAllnotifyAll 方法;方法;23终止:终止:自然终止:自然终止:线程完成了自己的全部工作线程完成了自己的全部工作强迫终止:强迫终止:在线程执行完之前,调用在线程执行完之前,调用 stopstop 或或 destroydestroy 方法终止线程方法终止线程24创建状态创建状态可运行状态可运行状态阻塞状态阻塞状态终止状态终止状态Start()Run()结束结束Stop()Stop()I/O受阻受阻Suspend()Wait()Sleep()Sleep()结束结束Notify()Resume()I/O完成完成Xueping Shen25JavaJava中的多线程是建立
23、在中的多线程是建立在ThreadThread类类,Runnable,Runnable接口接口的的根底上的,通常有两种方法让我们来创立一个新的线根底上的,通常有两种方法让我们来创立一个新的线程:程:创立一个创立一个ThreadThread类类, ,或者一个或者一个ThreadThread子类的对象;子类的对象;创立一个实现创立一个实现RunnableRunnable接口的类的对象;接口的类的对象;Xueping Shen26Thread的构造方法的构造方法Thread;ThreadRunnable target;ThreadRunnable target, String name;ThreadS
24、tring name;ThreadThreadGroup group, Runnable target;ThreadThreadGroup group, Runnable target, String name;ThreadThreadGroup group, Runnable target, String name, long stackSize;ThreadThreadGroup group, String name;namename: :线程的名称线程的名称, ,targettarget: :要运行的线程对象要运行的线程对象, ,groupgroup: :线程组的名线程组的名称称, ,s
25、tackSizestackSize: :堆栈的大小堆栈的大小ThreadThread类介绍类介绍Xueping Shen27ThreadThread类介绍类介绍Thread的主要方法的主要方法共共34个个,其中其中5个不再使用了个不再使用了static Thread currentThread;int getPriority;String getName;ThreadGroup getThreadGroup;void interrupt;boolean isInterrupted;void join;joinlong millis;joinlong millis, int nanos;stat
26、ic void yield;void setNameString name;void setPriorityint priority;void start;boolean isAlive;static void sleeplong millis, int nanos;void run;static void sleeplong millis;countStackFrames; suspend; resume; stop; stopThrowable obj; Xueping Shen28ThreadThread类的常用方法类的常用方法currentThreadcurrentThread:返回当
27、前运行的:返回当前运行的ThreadThread对象。对象。setNamesetName:设置线程的名字。:设置线程的名字。 getNamegetName:返回该线程的名字。:返回该线程的名字。 setPrioritysetPriority:设置线程优先级。:设置线程优先级。 getPrioritygetPriority:返回线程优先级。:返回线程优先级。 startstart:启动一个线程。:启动一个线程。 runrun:线程体:线程体, ,由由startstart方法调用方法调用, ,当当runrun方法返回时方法返回时, ,当前的线程完毕。当前的线程完毕。 stopstop:使调用它的线
28、程立即停顿执行。:使调用它的线程立即停顿执行。 isAliveisAlive:假如线程已被启动并且未被终止,那:假如线程已被启动并且未被终止,那么么isAliveisAlive:返回:返回truetrue。假如返回。假如返回falsefalse,那么,那么该线程是新创立或是已被终止的。该线程是新创立或是已被终止的。Xueping Shen29ThreadThread类的常用方法类的常用方法sleepsleepint nint n:使线程睡眠:使线程睡眠n n毫秒毫秒,n,n毫秒后毫秒后, ,线程可以线程可以再次运行再次运行。 yieldyield:将:将CPUCPU控制权主动移交到下一个可运行
29、线程。控制权主动移交到下一个可运行线程。joinjoin:方法:方法joinjoin将引起现行线程等待,直至方将引起现行线程等待,直至方法法joinjoin所调用的线程完毕。所调用的线程完毕。 suspendsuspend: 使线程挂起使线程挂起, ,暂停运行。暂停运行。 resumeresume 恢复挂起的线程恢复挂起的线程, ,使其处于可运行状态使其处于可运行状态RunnableRunnable。 waitwait:notifynotify:notifyAllnotifyAll:suspendsuspend; ;resumeresume; ;StopStop; ;目前已经不再使用。为什么?
30、请目前已经不再使用。为什么?请看看API.API.Xueping Shen30因为因为JavaJava线程的调度不是分时的,所以你必须确保你线程的调度不是分时的,所以你必须确保你的代码中的线程会不时地给另外一个线程运行的时机。的代码中的线程会不时地给另外一个线程运行的时机。有三种方法可以做到一点:有三种方法可以做到一点:让处于运行状态的线程调用让处于运行状态的线程调用Thread.sleepThread.sleep方法。方法。让处于运行状态的线程调用让处于运行状态的线程调用Thread.yieldThread.yield方法。方法。 让处于运行状态的线程调用另一个线程的让处于运行状态的线程调用
31、另一个线程的joinjoin方法方法。Xueping Shen31sleep和和yield的区别的区别这两个方法都是静态的实例方法。这两个方法都是静态的实例方法。yield让运行中的线程主动放弃当前获得的让运行中的线程主动放弃当前获得的CPU处处理时机,但不是使该线程阻塞,而是使之转入就绪状理时机,但不是使该线程阻塞,而是使之转入就绪状态。态。yield给一样优先级或更高的线程运行时机给一样优先级或更高的线程运行时机,假如,假如当前没有存在一样优先级的线程,那么当前没有存在一样优先级的线程,那么yield什么什么都不做。都不做。而而sleep不会考虑线程的优先级,会给其不会考虑线程的优先级,会
32、给其他线程运行的时机,因此也会给一样或更低优先级线他线程运行的时机,因此也会给一样或更低优先级线程运行时机程运行时机。sleep使线程转入阻塞状态,而使线程转入阻塞状态,而yield使线程转使线程转入入runnable状态。状态。sleep会有中断异常抛出会有中断异常抛出,而,而yiled不抛出任何不抛出任何异常。异常。sleep方法具有更好的可移植性方法具有更好的可移植性,因为,因为yield的的实现还取决于底层的操作系统对线程的调度策略。实现还取决于底层的操作系统对线程的调度策略。对于对于yield的主要用处是在测试阶段,人为的进步的主要用处是在测试阶段,人为的进步程序的并发性能,以帮助发
33、现一些隐藏的并发错误程序的并发性能,以帮助发现一些隐藏的并发错误,当程序正常运行时,那么不能依靠当程序正常运行时,那么不能依靠yield方法进步程序方法进步程序的并发行能。的并发行能。Xueping Shen32方法方法waitwait与与sleepsleep 方法一样,都能使线方法一样,都能使线程等待而停顿运行,程等待而停顿运行,其区别在于其区别在于sleepsleep方法方法不会释放对象的锁,而不会释放对象的锁,而waitwait方法进入等待时,方法进入等待时,可以释放对象的锁,因此别的线程能对这些加锁可以释放对象的锁,因此别的线程能对这些加锁的对象进展操作。所以,的对象进展操作。所以,w
34、ait,notifywait,notify和和notifyAllnotifyAll都是与同步相关联的方法都是与同步相关联的方法, ,只有在只有在synchronizedsynchronized方法中才可以用。方法中才可以用。在不同步的方法或代码中那么使用在不同步的方法或代码中那么使用sleepsleep方方法使线程暂时停顿运行。法使线程暂时停顿运行。Xueping Shen33 线程类线程类ThreadThread中提供以下几个版本的中提供以下几个版本的joinjoin方方法。法。使当前正在运行的线程暂停下来,等待指定的时间后使当前正在运行的线程暂停下来,等待指定的时间后或等待调用该方法的线程
35、完毕后,再恢复运行。或等待调用该方法的线程完毕后,再恢复运行。 public final void joinpublic final void jointhrows throws InterruptedException;InterruptedException; public final void joinpublic final void joinlong millis,int long millis,int nanosnanosthrows InterruptedException;throws InterruptedException; public final void joinpu
36、blic final void joinlong millislong millisthrows throws InterruptedException;InterruptedException;joinjoin 方法:方法:举例:举例:TestSubThread2.javaTestSubThread2.javaXueping Shen34public void timeout/ 暂停该线程,等候其他线程暂停该线程,等候其他线程tt完毕完毕tt.join;/ 其他线程完毕后,继续进展该线程其他线程完毕后,继续进展该线程 join:方法:方法join将引起现行线程等待,直至方法将引起现行线程等待
37、,直至方法join所调用的线程完毕。所调用的线程完毕。Xueping Shen35Xueping Shen36将一个类定义为将一个类定义为Thread的子类的子类,那么这个类就可以那么这个类就可以 用来创立线程。用来创立线程。 这个类中有一个这个类中有一个至关重要的方法至关重要的方法public void run,这个方法称为,这个方法称为线程体线程体,它是整个线程的,它是整个线程的核心核心,线程线程所要完成任务的代码都定义在所要完成任务的代码都定义在线程体线程体中,实中,实际上际上不同功能的线程之间的区别不同功能的线程之间的区别就在于它们线程体就在于它们线程体的不同的不同举例:举例:Thre
38、adTester.java TestSubThread.java TestMyThread.java Example19_1.javaExample19_1.java UseThread.javaUseThread.java应用线程类创立线程应用线程类创立线程Xueping Shen37创建线程对象创建线程对象启动一个线程启动一个线程线程体线程体的执行的执行线程子类名线程子类名 线程对象名线程对象名=new 线程子类名(实际参数)线程子类名(实际参数)线程对象名线程对象名.start();Run()方法的执行方法的执行TimePrinter.javaXueping Shen38Thread.s
39、leep方法的使用,注意异常的抛出Xueping Shen39Xueping Shen40Xueping Shen41Thead.yield方法Xueping Shen42主线程和其他线程共存Xueping Shen43Xueping Shen44Thread.sleep方方法的使用,注意异法的使用,注意异常的抛出常的抛出Xueping Shen45Xueping Shen46join方法的使用,注意异常的抛出。保证了主线程最后完毕Xueping Shen47Xueping Shen48Xueping Shen49Xueping Shen50应用应用Runnable接口创立线程接口创立线程Ru
40、nnable是是Java中用以实现线程的接口,中用以实现线程的接口,从根本从根本上讲,任何实现线程功能的类都必须实现该接口。上讲,任何实现线程功能的类都必须实现该接口。ThreadRunnable target;ThreadRunnable target, String name;wRunnable接口中只定义了一个方法就是接口中只定义了一个方法就是run方法,也就是线程体。方法,也就是线程体。举例举例: TimePrinter1.java TestMyClassThread.java UseRunnable.java UseRunnable.htmlXueping Shen51Xueping
41、 Shen52Xueping Shen53Xueping Shen54因为因为Java只允许单继承,假如一个类已经继承了只允许单继承,假如一个类已经继承了Thread,就不能再继承其他类。,就不能再继承其他类。n比方对于比方对于Applet程序,由于必须继承程序,由于必须继承java. applet.Applet,因此就只能采取这种实现接口的方,因此就只能采取这种实现接口的方法。法。特别是在除了特别是在除了run方法以外方法以外,并不打算重写并不打算重写Thread类的其它方法的情况下类的其它方法的情况下,以实现以实现Runnable接口的方式生接口的方式生成新线程就显得更加合理了。成新线程就
42、显得更加合理了。适用于采用实现适用于采用实现Runnable接口方法的情况接口方法的情况Xueping Shen55终止线程终止线程当线程执行完当线程执行完runrun方法,它将自然终止运方法,它将自然终止运行。行。 ThreadThread有一个有一个stopstop方法,可以强迫完毕方法,可以强迫完毕线程,但这种方法是不平安的。因此,在线程,但这种方法是不平安的。因此,在JDK1.2JDK1.2开场的版本中,开场的版本中,stopstop方法已经被废方法已经被废弃。弃。实际编程中,一般是定义一个标志变量,然后实际编程中,一般是定义一个标志变量,然后通过程序来改变标志变量的值,从而控制线程通过程序来改变标志变量的值,从而控制线程从从runrun方法中自然退出。方法中自然退出。Xueping Shen56Xueping Shen571.创立一个创立一个Thread类的子类类的子类2.在子类中将希望该线程做的工作写到在子类中将希望该线程做的工作写到run里面里面3.生成该子类的一个对象生成该子类
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 运输服务合同(2篇)
- 少先队课件模板
- 推敲课件苏教版
- 古诗词诵读《燕歌行并序》-高二语文大单元教学同步备课(统编版选择性必修中册)
- 第14课 《背影》-八年级语文上册同步备课精讲(统编版)
- 蚂蚁 故事 课件
- 西南林业大学《比较文学概论》2023-2024学年第一学期期末试卷
- 西京学院《建筑信息模型》2022-2023学年第一学期期末试卷
- 西京学院《机械原理》2022-2023学年第一学期期末试卷
- 温度变化对化学平衡的移动影响
- 全国防返贫监测信息系统业务管理子系统操作手册
- 2022年数学广角内容解读及教学思考
- 二级减速器箱体盖工艺卡片
- 互联网高速专线电路开通测试报告[宝典]
- 虎牌电饭煲中文使用说明书
- 餐饮合同范本
- 人教版初中地理七年级上册《地球自转》说课稿
- 高职院校课程标准模板
- 注塑品质检验标准
- 无铅压电陶瓷项目可行性研究报告-可参考案例-备案立项
- 海口市建设项目环评审批办事指南
评论
0/150
提交评论