




已阅读5页,还剩62页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第九章 线程1目录l Java中的线程l 线程的生命周期l Thread的子类创建线程l 使用 Runable接口l 线程的常用方法l 线程的优先级l 线程同步l 在同步方法中使用 wait()、 notify 和 notifyAll()方法l 挂起、恢复和终止线程l 本章小结2线程的概念l 进程和线程的区别( Example9_11)l 进程 一个独立程序的每一次运行称为一个进程,例如l 用字处理软件编辑文稿时,同时打开 mp3播放程序听音乐,这两个独立的程序在同时运行,称为两个进程 设置一个进程要占用相当一部分处理器时间和内存资源 大多数操作系统不允许进程访问其他进程的内存空间, 进程间的通信 很不方便,编程模型比较复杂 进程通信方式共享存储器系统、消息传到机制、管道通信3l 线程 一个程序中多段代码同时并发执行,称为多线程 通过多线程,一个 进程 表面上看同时可以执行一个以上的任务 并发 创建线程比创建进程开销要小得多,线程之间的协作和数据交换也比较容易 (进程独站资源 ) 线程间共享资源(内存、代码、数据)有利于并行处理线程的概念 (续 )4线程的状态与生命周期l 新建 : 当一个 Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态。此时它已经有了相应的内存空间和其他资源。l 就绪状态 :线程等待 CPUl 运行状态 : start()方法开始执行l 中断 (阻塞 )状态 : sleep(), wait(), I/O 完成 or 发布 I/O 请求 sleep(): 使当前线程进入等待状态,参数设定其等待时间 wait(): 使当前线程进入等待状态,调用nofify(), or notifyAll(), 使其重新进入线程等待队列l 死亡 : run() 方法完成 stop() 方法被调用 5Life Cycle of Thread6l 诞生状态 线程刚刚被创建l 就绪状态 线程的 start 方法已被执行 线程已准备好运行l 运行状态 处理机分配给了线程,线程正在运行l 阻塞状态( Blocked) 在线程发出输入 /输出请求且必须等待其返回 遇到用 synchronized标记的方法而未获得其监视器暂时不能进入执行时l 休眠状态( Sleeping) 执行 sleep方法而进入休眠l 死亡状态 线程已完成或退出线程的几种基本状态 (续 )7l 主线程: Java应用程序总是从主类的 main方法开始执行。当 JVM加载代码,发现 main方法之后,启动的线程称作 “主线程 ”,该线程负责执行 main方法。l 在 main方法的执行中再创建的线程,就称为程序中的其它线程。l 如果 main方法中没有创建其他的线程,那么当main方法执行完最后一个语句, JVM就会结束Java应用程序。l 如果 main方法中又创建了其他线程,那么 JVM就要在主线程和其他线程之间轮流切换, main方法即使执行完最后的语句, JVM也不会结束程序,JVM一直要等到程序中的所有线程都结束之后,才结束 Java应用程序。 8l Java中创建线程的两种方法Thread 类的子类 创建线程对象,子类重写 Thread类中的 run()方法 使用 Thread类直接创建线程对象,但需要使用 Runable接口9Thread类l Thread类 在 Java程序中创建多线程的方法之一是继承 Thread类 封装了 Java程序中一个线程对象需要拥有的属性和方法 从 Thread类派生一个子类,并创建这个子类的对象,就可以产生一个新的线程。这个子类应该重写 Thread类的run() 方法,在 run方法中写入需要在新线程中执行的语句段。这个子类的对象需要调用 start方法来启动,新线程将自动进入 run方法。原线程将同时继续往下执行 它位于 java.lang包中,因而程序开头不用 import任何包就可直接使用l 例子: Example9_1.java10public class Example9_1 public static void main(String args) Lefthand left;Righthand right; left=new Lefthand() ; /创建线程right=new Righthand();left.start(); right.start();for(int i=1;i0) result=result*i;i=i-1;System.out.println(“The factorial of “+num+“ is “+result); System.out.println(“new thread ends“); l 运行结果main thread startsmain thread endsnew thread startedThe factorial of 10 is 3628800new thread endsThread类 (续 )13l 结果说明 main线程已经执行完后,新线程才执行完 main函数调用 thread.start()方法启动新线程后并不等待其 run方法返回就继续运行 (执行 System.out.println(),thread.run函数在一边独自运行,不影响原来的 main函数的运行l 源程序修改 如果启动新线程后希望主线程多持续一会再结束,可在start语句后加上让当前线程( main)休息 1毫秒的语句:try Thread.sleep(1); catch(Exception e);Thread类 (续 )14l 修改后运行结果main thread startsnew thread staredThe factorial of 10 is 3628800new thread endsmain thread endsl 运行结果说明 新线程结束后 main线程才结束l 例子 Ex8_1.javaThread类 (续 ) 例 8_1修改后运行结果15Thread类 (续 ) 常用 API函数名称 说 明public Thread() 构造一个新的 线 程 对 象,默 认 名 为 Thread-n, n是从 0开始 递 增的整数public Thread(Runnable target)构造一个新的 线 程 对 象,以一个 实现Runnable接口的 类 的 对 象 为 参数。 默 认线 程名 为 Thread-n, n是从 0开始 递 增的整数public Thread(String name) 构造一个新的 线 程 对 象,并同 时 指定 线 程名public static Thread currentThread() 返回当前正在运行的 线 程 对 象public static void yield()使当前 线 程 对 象 暂 停,允 许别 的 线 程开始运行public static void sleep(long millis)使当前 线 程 暂 停运行指定毫秒数,但此 线 程并不失去已 获 得的 锁 旗 标 。16public void start() 启 动线 程, JVM将 调 用此 线 程的 run方法, 结 果是将同 时 运行两个 线 程,当前 线程和 执 行 run方法的 线 程public void run() Thread的子 类应该 重写此方法,内容 应为该线 程 应执 行的任 务 。public final void stop() 停止 线 程运行, 释 放 该线 程占用的 对 象锁 旗 标 。public void interrupt() 打断此 线 程public final void join() 在当前 线 程中加入 调 用 join方法的 线 程 A,直到 线 程 A死亡才能 继续执 行当前 线 程public final void join(long millis)在当前 线 程中加入 调 用 join方法的 线 程 A,直到到达参数指定毫秒数或 线 程 A死亡才能 继续执 行当前 线 程Thread类 (续 ) 常用 API函数17public final void setPriority(int newPriority)设 置 线 程 优 先 级public final void setDaemon(Boolean on)设 置是否 为 后台 线 程,如果当前运行 线 程均 为 后台 线 程 则 JVM停止运行。 这 个方法必 须 在 start()方法前使用public final void checkAccess()判断当前 线 程是否有 权 力修改 调 用此方法的 线 程public void setName(String name) 更改本 线 程的名称 为 指定参数public final boolean isAlive()测试线 程是否 处 于活 动 状 态 ,如果 线 程被启 动 并且没有死亡 则 返回 trueThread类 (续 ) 常用 API函数18l 创建 3个新线程,每个线程睡眠一段时间( 0 6秒),然后结束public class Ex8_2 public static void main( String args ) /创建并命名每个线程TestThread thread1 = new TestThread( “thread1“ );TestThread thread2 = new TestThread( “thread2“ );TestThread thread3 = new TestThread( “thread3“ ); System.out.println( “Starting threads“ ); thread1.start(); / 启动线程 1thread2.start(); / 启动线程 2thread3.start(); / 启动线程 3 System.out.println( “Threads started, main endsn“ ); Thread类 (续 ) 例 8_219class TestThread extends Thread private int sleepTime; public TestThread( String name ) super( name ); /调用父类构造函数为线程命名sleepTime = ( int ) ( Math.random() * 6000 ); public void run() try System.out.println( getName() + “ going to sleep for “ + sleepTime ); Thread.sleep( sleepTime ); /线程休眠 catch ( InterruptedException exception ) ;System.out.println( getName() + “ finished“ Thread类 (续 ) 例 8_220l 运行结果Starting threadsThreads started, main endsthread1 going to sleep for 3519thread2 going to sleep for 1689thread3 going to sleep for 5565thread2 finishedthread1 finishedthread3 finishedl 说明 由于线程 3休眠时间最长,所以最后结束,线程 2休眠时间最短,所以最先结束 每次运行,都会产生不同的随机休眠时间,所以结果都不相同Thread类 (续 ) 例 8_2运行结果21Runnable接口l Runnable接口 在编写复杂程序时相关的类可能已经继承了某个基类,而 Java不支持多继承,在这种情况下,便需要通过实现 Runnable接口来生成多线 使用 Thread创建线程对象时,通常使用的构造方法是:Thread( Runnable target)该构造方法中的参数是一个 Runnable类型的接口,因此,在创建线程对象时必须 向构造方法的参数传递一个实现 Runnable接口类的实例 ,该实例对象称作所创线程的 目标对象 . 当线程调用 start方法后,一旦轮到它来享用 CPU资源,目标对象就会自动调用接口中的 run方法(接口回调) . 对于使用同一目标对象的线程,目标对象的成员变量自然就是这些线程的共享数据单元 不同 run()方法中的局部变量互不干扰。 修改 Ex8_1.javal 例子: workspace/ThreadDemo2_2.java( java2006/example9/ThreadDemo1_1,ThreadDemo2_2)l 例子: Example9_3.javaTestThread extends ThreadTestThread implements Runnablenew Thread(Runnable th).start22l 使用 Runnable接口实现 Ex8_1功能 (使用一个目标对象 )public class Ex8_1public static void main( String args ) System.out.println(“main thread starts“);FactorialThread t=new FactorialThread(10);new Thread(t).start(); /创建 Thread对象System.out.println(“new thread started,main thread ends “ ); Runnable接口 (续 ) 例 8_1_1Runnable接口类的实例23class FactorialThread implements Runnable private int num; public FactorialThread( int num ) this.num=num; public void run() int i=num; int result=1; while(i0) result=result*i;i=i-1;System.out.println(“The factorial of “+num+“ is “+result); System.out.println(“new thread ends“); Runnable接口 (续 ) 例 8_324l 使用 Runnable接口实现例 8_2功能(使用不同目标对象)public class Ex8_4public static void main( String args ) TestThread thread1 = new TestThread();TestThread thread2 = new TestThread();TestThread thread3 = new TestThread(); System.out.println( “Starting threads“ );new Thread(thread1,“Thread1“).start(); new Thread(thread2,“Thread2“).start();new Thread(thread3,“Thread3“).start();System.out.println( “Threads started, main endsn“ ); Runnable接口 (续 ) 例 8_4传递一个实现 Runnable接口类的实例,并启动线程25class TestThread implements Runnable private int sleepTime; public TestThread() sleepTime = ( int ) ( Math.random() * 6000 ); public void run() try System.out.println( Thread.currentThread().getName() + “ going to sleep for “ + sleepTime );Thread.sleep( sleepTime ); catch ( InterruptedException exception ) ;System.out.println( Thread.currentThread().getName()+ “finished“ ); Runnable接口 (续 ) 例 8_4Starting threadsThreads started, main endsThread2 going to sleep for 1498Thread1 going to sleep for 4544Thread3 going to sleep for 3251Thread2 finishedThread3 finishedThread1 finished26线程间的数据共享l 代码共享 多个线程的执行代码来自同一个类的 run方法时,即称它们共享相同的代码l 数据共享 当共享访问相同的对象时,即它们共享相同的数据 不同线程的 run()方法中的 局部变量 互不干扰 (Example9_5_1.java) 使用 Runnable接口可以轻松实现多个线程共享相同数据,只要用同一个实现了 Runnable接口的实例作为参数创建多个线程即可 (Ex8_5.java , p233-例 9.3 )27class Example9_5_1 public static void main(String args) Move move = new Move();new Thread(move,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年康复医疗服务体系在康复医疗市场中的竞争策略与市场拓展报告
- 中医识药考试题及答案
- 2025年交通设备制造业数字化转型与智能生产设备维护管理研究报告
- 2025年事业单位工勤技能-安徽-安徽计算机操作员四级(中级工)历年参考题库含答案解析
- 2025年事业单位工勤技能-安徽-安徽汽车修理工(技师/高级技师)历年参考题库含答案解析
- 2025年事业单位工勤技能-安徽-安徽农机驾驶维修工二级(技师)历年参考题库含答案解析
- 2025年事业单位工勤技能-安徽-安徽不动产测绘员四级(中级工)历年参考题库含答案解析
- 高铁车站管理岗位招聘面试题
- 8月推拿治疗学模拟考试题(附参考答案)
- 电工初中级考证试题及答案
- 软件项目开发需求规格说明书(标准模板)
- GB/T 9797-2022金属及其他无机覆盖层镍、镍+铬、铜+镍和铜+镍+铬电镀层
- GB/T 33365-2016钢筋混凝土用钢筋焊接网试验方法
- GB/T 32288-2015电力变压器用电工钢铁心
- FZ/T 01008-2008涂层织物耐热空气老化性的测定
- 精神科病历书写精神科病历书写及范例
- 《乒乓裁判规则规程》考试题库(附答案)
- 依托自主化装备建设分布式能源三联供项目
- 老年肌肉衰减综合征(肌少症)课件
- PCB全制程培训教材
- 应急保障措施及处置方案
评论
0/150
提交评论