jave培训:多线程(共61张)

上传人:夏日****8 文档编号:253876657 上传时间:2022-02-14 格式:PPTX 页数:61 大小:340.79KB
返回 下载 相关 举报
jave培训:多线程(共61张)_第1页
第1页 / 共61页
jave培训:多线程(共61张)_第2页
第2页 / 共61页
jave培训:多线程(共61张)_第3页
第3页 / 共61页
jave培训:多线程(共61张)_第4页
第4页 / 共61页
jave培训:多线程(共61张)_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《jave培训:多线程(共61张)》由会员分享,可在线阅读,更多相关《jave培训:多线程(共61张)(61页珍藏版)》请在金锄头文库上搜索。

1、第七讲 多线程n 多线程基本概念n 创建线程的方式n 线程的生命周期及控制n 线程的优先级及调度n 多线程的互斥与同步n 守护线程 (Daemon)n 线程组 (ThreadGroup)n并发现象在现实生活中大量存在n人体(消化、运动)n计算机(同时运行多中程序)n多线程在一个程序中实现并发n编程语言一般提供了串行程序设计的方法n计算机的并发能力由操作系统提供nJava在语言级提供多线程并发的概念1、多线程基本概念1、多线程基本概念以前所编写的程序,每个程序都有一个入口、一个出口以及一个顺序执行的序列,在程序执行过程中的任何指定时刻,都只有一个单独的执行点。事实上,在单个程序内部是可以在同一时

2、刻进行多种运算的,这就是所谓的多线程(这与多任务的概念有相似之处)。一个单独的线程和顺序程序相似,也有一个入口、一个出口以及一个顺序执行的序列,从概念上说,一个线程是一个程序内部的一个顺序控制流。线程并不是程序,它自己本身并不能运行,必须在程序中运行。在一个程序中可以实现多个线程,这些线程同时运行,完成不同的功能。将军令多线程1、多线程基本概念从逻辑的观点来看,多线程意味着一个程序的多行语句同时执行,但是多线程并不等于多次启动一个程序,操作系统也不会把每个线程当作独立的进程来对待:n 两者的粒度不同,是两个不同层次上的概念。进程是由操作系统来管理的,而线程则是在一个程序(进程)内。n 不同进程

3、的代码、内部数据和状态都是完全独立的,而一个程序内的多线程是共享同一块内存空间和同一组系统资源,有可能互相影响。n 线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担要小。1、多线程基本概念n进程:程序的一次执行。n程序代码n程序数据n程序资源n线程:进程中程序代码的一个执行序列。n程序调用堆栈n线程局部变量n可共享访问进程中的数据和资源n操作系统按线程来调度程序的执行1、多线程基本概念文件输入输出装置各种系统资源数据区段程序区段只有一个地方在执行文件输入输出装置各种系统资源数据区段程序区段同时有数个地方在执行传统的进程多线程的任务1、多线程基本概念

4、1、多线程基本概念多线程的优势:n多线程编程简单,效率高(能直接共享数据和资源,多进程不能)n适合于开发服务程序(如Web服务,聊天服务等)n适合于开发有多种交互接口的程序(如聊天程序的客户端,网络下载工具)n适合于有人机交互又有计算量的程序(如字处理程序Word,Excel)n 减轻编写交互频繁、涉及面多的程序的困难(如监听网络端口)n 程序的吞吐量会得到改善(同时监听多种设备,如网络端口、串口、并口以及其他外设)n 有多个处理器的系统,可以并发运行不同的线程(否则,任何时刻只有一个线程在运行)1、多线程基本概念 虽然各种操作系统(Unix/Linux、Windows系列等)都支持多线程,但

5、若要用C、C+或其他语言编写多线程程序是十分困难的,因为它们对数据同步的支持不充分。 对多线程的综合支持是Java语言的一个重要特色,它提供了Thread类来实现多线程。在Java中,线程可以认为是由三部分组成的: 虚拟CPU,封装在java.lang.Thread类中,它控制着整个线程的运行; 执行的代码,传递给Thread类,由Thread类控制顺序执行; 处理的数据,传递给Thread类,是在代码执行过程中所要处理的数据。2、创建线程的方式 Java的线程是通过Java的软件包java.lang中定义的类Thread来实现的。当生成一个Thread类的对象之后,就产生了一个线程,通过该对

6、象实例,可以启动线程、终止线程、或者暂时挂起线程等。2、创建线程的方式q Thread类本身只是线程的虚拟CPU;q 线程所执行的代码(或者说线程所要完成的功能)是通过方法run( )(包含在一个特定的对象中)来完成的,方法run( )称为线程体。实现线程体的特定对象是在初始化线程时传递给线程的。q 在一个线程被建立并初始化以后,Java的运行时系统就自动调用run( )方法,正是通过run( )方法才使得建立线程的目的得以实现。q 通常,run( )方法是一个循环,例如一个播放动画的线程要循环显示一系列图片。有时,run( )方法会执行一个时间较长的操作,例如下载并播放一个JPEG格式的电影

7、。 先来看看线程对象的初始化,类Thread的构造方法如下:public Thread( ThreadGroup group, Runnable target, String name) group指明了线程所属的线程组; target是线程体run()方法所在的对象; name是线程的名称。 target必须实现接口Runnable。在接口Runnable中只定义了一个方法void run()作为线程体。任何实现接口Runnable的对象都可以作为一个线程的目标对象。 类Thread本身也实现了接口Runnable(空实现),因此,上述构造方法中各参数都可以为null。2、创建线程的方式 从

8、Thread类的构造方法可以看出,用户可以有两种方法构造自己的run( )方法。 方法一: 定义一个线程类,它继承类Thread并重写其中的方法run()。这时在初始化这个类的实例时,目标对象target可以为null,表示这个实例本身具有线程体。由于Java只支持单继承,用这种方法定义的类不能再继承其他类。2、创建线程的方式class SimpleThread extends Thread public SimpleThread(String str) super(str); public void run() for (int i = 0; i 10; i+) System.out.pri

9、ntln(i + + getName(); try sleep(int)(Math.random() * 1000); catch (InterruptedException e) System.out.println(DONE! + getName(); TwoThreadsTest.java2、创建线程的方式 方法二: 提供一个实现接口Runnable的类作为线程的目标对象。在初始化一个Thread类或子类生成线程实例时,把目标对象传递给这个线程实例,由该目标对象提供线程体run()方法。这时,实现接口Runnable的类还可以再继承其他类,即实现接口Runnable的类可以不单纯是提供线

10、程体。2、创建线程的方式public class Clock extends java.applet.Applet implements Runnable Thread clockThread; public void start() if (clockThread = null) clockThread = new Thread(this, Clock);clockThread.start(); public void run() while (clockThread != null) repaint();try clockThread.sleep(1000);catch (Interrup

11、tedException e) public void paint(Graphics g) Date now = new Date(); g.drawString(now.getHours() + : + now.getMinutes() + : + now.getSeconds(), 5, 10); public void stop() clockThread.stop(); clockThread = null; Clock.java run ()方法是运行线程的主体,启动线程时,由java直接调用public void run()。 使用Runnable接口可以将线程的虚拟CPU、代码和

12、数据分开,形成一个比较清晰的模型。 使用Runnable接口使得包含线程体的类还可以继承其他类。 直接继承Thread类以后不能再继承其他类,但编写简单,并可直接操纵线程;使用Runnable接口时,若要在run()方法中操纵线程,必须使用Thread.currentThread()方法。 在具体应用中,采用哪种方法来构造线程体要根据具体情况而定。通常,当一个线程体所在的类已经继承了另一个类时,就应该用实现Runnable接口的方法。2、创建线程的方式2、创建线程的方式Thread类的方法nvoidrun()n线程所执行的代码nvoidstart()throwsIllegalThreadSta

13、teExceptionn使程序开始执行,多次调用会产生例外nvoidsleep(longmilis)n让线程睡眠一段时间,此期间线程不消耗CPU资源nvoidinterrupt()n中断线程nstaticbooleaninterrupted()n判断当前线程是否被中断(会清除中断状态标记)nbooleanisInterrupted()n判断指定线程是否被中断线程状态控制方法2、创建线程的方式Thread类的方法nbooleanisAlive()n判断线程是否处于活动状态(即已调用start,但run还未返回)nstaticThreadcurrentThread()n返回当前线程对象的引用nvo

14、idsetName(StringthreadName)n改变线程的名字nStringgetName()n获得线程的名字nStringtoString()n例子:ThreadThread-0,1,testnvoidjoin(longmillis,intnanos)n等待线程结束2、创建线程的方式Thread类的方法nvoiddestroy()n销毁线程nvoidstop()n终止线程的执行nvoidsuspend()/voidresume()n挂起线程/nstaticvoidyield()n暂停当前线程,让其他线程执行nvoidsetDaemon(booleanon)/voidsetPriori

15、ty(intp)n获得线程的名字nnotify()/notifyAll()/wait()从Object继承而来3、 线程的生命周期及控制线程是程序内部的一个顺序控制流,它具有一个特定的生命周期。在一个线程的生命周期中,它总处于某一种状态中。线程的状态表示了线程正在进行的活动以及在这段时间内线程能完成的任务。 3、线程的生命周期及控制new Thread()New ThreadRunnablestart()Not Runnablestop()stop()Deadyield()stop()run()exit. .suspend()sleep()wait()I/O流阻塞resume()notify(

16、)/notifyAll()I/O指令.waitingsleepingsuspendingblockedreadyrunningbornreadyrunningwaitingsleepingdeadblockedstart()dispatchquantum expirationyield()waitsleep()run completeissue I/O requestwait interval expiresnotify()notifyAll()interrupt()I/O completesleep interval expiresinterrupt() 3、线程的生命周期及控制 3、线程的生命周期及控制创建状态(newThread)当创建了一个新的线程时(myThread thd = new myThread();),它就处于创建状态,此时它仅仅是一个空的线程对象,系统不为它分配资源。处于这种状态时只能启动或终止该线程,调用除这两种以外的其它线程状态相关的方法都会失败并且会引起非法状态例外IllegalThreadStateException(对于其它状态,若所调用的方法与状态不符

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > PPT模板库 > 其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号