




已阅读5页,还剩55页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java 的多线程机制 1Java的多线程机制 6主要内容 4线程的概念 线程的生命周期 4Java中多线程的编程 继承Thread类与使用Runnable接口 Thread类的主要方法 4线程的同步与死锁 4动画 2Java的多线程机制 6 程序 - 进程 - 线程 4程序是为完成特定任务、用某种语言编写的 一组指令的集合。指一段静态的代码。 4进程是程序的一次执行过程,是系统进行调 度和资源分配的一个独立单位。 执行 就绪等待 PCB CPU 挂起 3Java的多线程机制 6 程序-进程-线程 4线程是比进程更小一级的执行单元。 4一个进程在其执行过程中,可以产生多个线程,形 成多条执行线索。 4每个线程也有它自身的产生、存在和消亡的过程, 也是一个动态的概念。 4一个线程有它自己的入口和出口,以及一个顺序执 行的序列 4线程不能独立存在,必须存在于进程中,各线程间 共享进程空间的数据。 4线程 线程创建、销毁和切换的负荷远小于进程, 又称为轻量级进程(lightweight process)。 系统负担小,主要是CPU的分配。 4Java的多线程机制 6基本概念之一:进程 4进程是正在运行的一个程序 4程序:静态对象进程:动态过程 4操作系统为每个进程分配一段内存空间, 包括:代码、数据以及堆栈等资源 4多任务的操作系统(OS)中,进程切换对 CPU资源消耗较大 5Java的多线程机制 6基本概念之二:多线程 4多线程是指同时存在几个执行体,按几条不 同的执行线索共同工作的情况。 4多线程实现单个进程中的并发计算。 4各线程间共享进程空间的数据,并利用这些 共享单元来实现数据交换、实时通信与必要 的同步操作。 4多线程的程序能更好地表述和解决现实世界 的具体问题,是计算机应用开发和程序设计 的一个必然发展趋势。 6Java的多线程机制 6进程与多线程 单线程 多线程 进程 传统进程多线程进程 7Java的多线程机制 6线程的调度 4调度策略 时间片 抢占式:高优先级的线程抢占CPU 4Java的调度方法 同优先级同优先级线程组成先进先出队列,使用时间时间 片策略片策略 对高优先级,使用优先调度的抢占式优先调度的抢占式策略 1 2 8Java的多线程机制 6Java Java与多线程与多线程 4Java语言的一个重要功能特点就是内置对多 线程的支持,它使得编程人员可以很方便地 开发出具有多线程功能,能同时处理多个任同时处理多个任 务务的功能强大的应用程序。 4每个Java程序都有一个隐含的主线程 application main 方法 Applet小程序,主线程指挥浏览器加载并执 行 Java小程序。 9Java的多线程机制 6线程的概念模型 线程控制 (虚拟CPU) 线程代码 线程的三个组成部分 被操作数据 10Java的多线程机制 6线程的生命周期 4要想实现线程,必须在主线程中创建新的线程对象。 Java语言使用Thread类及其子类的对象来表示线程,在 它的一个完整的生命周期中通常要经历如下的五种状 态: 新建: 当一个Thread类或其子类的对象被声明并创建时,新 生的线程对象处于新建状态 就绪:处于新建状态的线程被启动后,将进入线程队列等待 CPU时间片,此时它已具备了运行的条件 运行:当就绪的线程被调度并获得处理器资源时,便进入运行 状态, run()方法定义了线程的操作和功能 阻塞:在某种特殊情况下,被人为挂起或执行输入输出操作 时,让出CPU并临时中止自己的执行,进入阻塞状态 死亡:线程完成了它的全部工作或线程被提前强制性地中止 stop()或destroy() 11Java的多线程机制 6线程的生命周期 12Java的多线程机制 6线程的生命周期(续) 4Newborn:线程已创建,但尚未执行 4Runnable:(就绪) 线程已被调度,按优先级和先到先服务原则在 队列中排队等待CPU时间片资源 4Runnnig:正在运行 4Blocked:(阻塞) 因某事件或睡眠而被暂时性地挂起 4Dead:正常/强行中断,退出运行状态 13Java的多线程机制 6线程状态 新建状态 new Thread() 就绪状态 start() 等待状态 执行状态 I/O sleep() CPU调度 run() 结束 stop() yield() 消亡 I/O完成 sleep时间到 14Java的多线程机制 6 Java对多线程的支持 提供对多线程的支持 4Thread类 start( ), stop( ), run( ) 4Runnable 接口 4实现多线程的两种编程方法 继承 Thread 类 实现 Runnable 接口 15Java的多线程机制 6 Thread类 4Thread类综合了Java程序中一个线程需要拥有 的属性和方法 4当生成一个Thread类的对象后,一个新的线程 诞生了。 4每个线程都是通过目标对象的方法run()来完成 其操作的。方法run() 称为线程体(线程方法)。 4提供线程体的目标对象是在初始化一个线程时 指明的。 4任何实现了Runnable接口(实现run()方法)的类 实例都可以作为线程的目标对象。 16Java的多线程机制 6 方法之一:继承Thread类 4Thread类的重要方法:run( ) 定义线程的具体操作 系统调度此线程时自动执行 初始时无具体操作内容 4如何编程呢? 继承继承ThreadThread类,定义类,定义 run( ) run( ) 方法方法 17Java的多线程机制 6 Easy? Lets try it! 4小例子: SimpleThread.java TwoThreadsTest.java 18Java的多线程机制 6 public class SimpleThread extends Thread public SimpleThread(String str) super(str); /创建具以str为名字的线程 public void run() /定义run()方法 for (int i = 0; i 10; i+) System.out.println(i + “ “ + getName(); try /休眠一段时间 sleep(int)(Math.random() * 1000); catch (InterruptedException e) System.out.println(“DONE! “ + getName(); / SimpleThread.java public class TwoThreadsTest public static void main (String args) new SimpleThread(“Take it myself?“).start(); new SimpleThread(“Give it to police!“).start(); /TwoThreadsTest.java19Java的多线程机制 6 Thread类 4java.lang包 4构造函数 Thread(); Thread(String threadname); 指定线程实例名 4线程的优先级控制 三个常量: MAX_PRIORITY 10; MIN _PRIORITY 1; NORM_PRIORITY 5; getPriority() 返回线程优先值 setPriority(int newPriority) 改变线程的优先级 线程创建时继承父线程的优先级 20Java的多线程机制 6 Thread类的有关方法 4void start(): 由Newborn到Runnable 启动线程 4String getName(): 返回线程的名称 4run(): 线程在被调度时执行的操作 4static void sleep(指定时间毫秒): 令当前活动线程在指定时间段内放弃对CPU控制,使 其他线程有机会被执行,时间到后重排队 产生例外InterruptedException 用try块调用sleep(),用catch块处理例外 21Java的多线程机制 6 Thread类的有关方法(续) 4suspend() :挂起线程,处于阻塞状态 4resume():恢复挂起的线程,重新进入就绪队 列排队 应用:可控制某线程的暂停与继续 方法:设一状态变量suspendStatus=false(初始) 暂停:if(!suspendStatus) T.suspend(); suspendStatus=true; 继续:if(suspendStatus) T.resume(); suspendStatus=false; 22Java的多线程机制 6 Thread类的有关方法(续) 4static void yield():对正在执行的线程 若就绪队列中有与当前线程同优先级的排队 线程, 则当前线程让出CPU控制权,移到队尾 若队列中没有同优先级的线程,忽略此方法 4stop(): 强制线程生命期结束 4boolean isAlive():返回boolean,表明是否线程还 存在 4static currentThread(): 返回当前线程 23Java的多线程机制 6 生成与运行线程 方法1 MyThread mt = new MyThread(); mt.start(); class MyThread extends Thread public void run() 线程体 执行run()方法 24Java的多线程机制 6建立线程 线程控制 (虚拟CPU) 线程代码被操作数据 Thread类的子类的实例 (mt) Thread类的子类提供 的 run方法 Thread子类实例(mt) 25Java的多线程机制 6 Thread类方法总结 4启动线程:start() 4有关线程执行的控制: stop()、suspend()、resume() 4有关调度控制 Thread.sleep(10); /低优先级的线程也可以获得执行 Thread.yield(); /同优先级的线程可以获得执行 suspend(); /暂停本线程 26Java的多线程机制 6 方法之二:Runnable 4Runnable接口 自定义类(,该类)实现Runnable接口 使用Thread类的另一构造函数: Thread(Runnable, String) 用实现了Runnable接口的类的对象中所定 义的run()方法, 来覆盖新创建的线程对象 的run()方法 使用start()启动线程 27Java的多线程机制 6 方法之二:Runnable(续) 4例: class A implements Runnable public void run(). class B public static void main(String arg) Runnable a=new A(); Thread t=new Thread(a); t.start(); 用实现了Runnable接口的类的对象中所定义的run()方 法, 来覆盖新创建的线程对象的run()方法 28Java的多线程机制 6建立线程例 public class ThreadTest public static void main(String args) Job1 j = new Job1(); Thread t1 = new Thread(j) ; t1.start() ; class Job1 implements Runnable int i =1 ; public void run() while (i50) System.out.println(i+) ; 29Java的多线程机制 6建立线程 线程控制 (虚拟CPU) 线程代码被操作数据 Thread的实例(t1) 由实现了Runnable接口 的类(Job1)提供run方法 实现Runnable接口的类 (Job1)的实例 ( j ) 30Java的多线程机制 6 生成与运行线程 方法2 class MyRun implements Runnable public void run() 线程体 MyRun mr = new MyRun(); Thread t1 = new Thread(mr) ; t1.start(); /Thread实例用于线程控制 4适合于:定义run()方法的类必须是其他类或其他类的 子类。 31Java的多线程机制 6 方法之二:Runnable(续) 4两种方法的选择 当需要从其他类,如Applet类继承时,使用 Runnable接口 当编写简单的程序时,可考虑使用继承 Thread类 4例:RaceApplet.java 具体运行结果(线程调度)与平台有关 32Java的多线程机制 6 public class Runner extends Thread /赛跑者线程类 public int tick = 1; public void run() while (tick 40000000) tick+; /Runner.java /RaceApplet是一个实现了多线程的Applet public class RaceApplet extends Applet implements Runnable final static int NUMRUNNERS = 2;/定义赛跑线程的个数 final static int SPACING = 20; /声明两个赛跑线程 Runner runners = new RunnerNUMRUNNERS; /声明一个画图线程 Thread updateThread = null; 33Java的多线程机制 6 public void init() /重载Applet的init()方法 for (int i = 0; i NUMRUNNERS; i+) runnersi = new Runner(); /创建赛跑线程线程 runnersi.setPriority(i+1); /设优先级first=1,second=2 if (updateThread = null) /创建绘图线程,并设优先级为3 updateThread = new Thread(this, “Thread Race“); updateThread.setPriority(NUMRUNNERS+1); addMouseListener(new MyAdapter(); /注册事件监听者 /end of init() 34Java的多线程机制 6 / 内部事件监听者类,监听鼠标事件 class MyAdapter extends MouseAdapter /鼠标点击后,开始赛跑及绘制线程 public void mouseClicked(MouseEvent evt) if (!updateThread.isAlive() updateThread.start(); /启动绘制线程 for (int i = 0; i NUMRUNNERS; i+) if (!runnersi.isAlive() runnersi.start(); /启动赛跑线程 /end of class MyAdapter 35Java的多线程机制 6 public void paint(Graphics g) /paint()方法中绘制框架 /end of paint() /update()方法中绘制赛跑者的进度 public void update(Graphics g) for (int i = 0; i NUMRUNNERS; i+) /画两条线 g.drawLine(SPACING, (i+1)*SPACING, SPACING + (runnersi.tick)/100000, (i+1)*SPACING); /end of update() 36Java的多线程机制 6 public void run() /实现Runnable接口的run()方法 while (true) repaint(); /重新绘制,自动调用update()方法 try Thread.sleep(10); /休眠,把执行机会让给低优先级线程 catch (InterruptedException e) /end of run() public void stop() /重载Applet的stop()方法 for (int i = 0; i NUMRUNNERS; i+) if (runnersi.isAlive() runnersi = null; /中止赛跑线程 if (updateThread.isAlive() updateThread = null; /中止绘图线程 /end of stop() / RaceApplet.java 37Java的多线程机制 6线程的同步与互斥 4问题的提出 多个线程执行的不确定性引起执行结果的 不稳定 如线程A: A1A2线程B: B1B2 多个线程对内存、数据的共享,会造成操 作的不完整性,会破坏数据。 如push(a): i+; numi=a; pop(): 取出numi;i-; 38Java的多线程机制 6线程的同步与互斥 4问题的解决 同步: 用synchronized关键字前缀给针对共享 资源的操作加锁;同步方法、同步块 synchronized void push(); synchronized int pop(); 临界区 实现机制:管程 39Java的多线程机制 6线程的同步与互斥 4对象互斥锁 在Java中,每个对象有一个“互斥锁”,该锁可用来保证 在同一时刻只能有一个线程访问该对象。 4锁的使用过程(当一个线程要操作一个对象时) 准备 加锁 对象是否 已加锁 加锁 进入 临界区 执行操作 解锁 否 是 40Java的多线程机制 6线程的同步与互斥 4加锁1 (临界区-方法) synchronized 方法名 进入该方法时加锁 4加锁2(临界区-代码块) 方法名 . synchronized(this) /进入该代码段时加锁 . 4一个线程为某对象加锁后,便对该对象具有了监控权 。 41Java的多线程机制 6线程的同步与互斥 4线程间需协调与通讯:生产者/消费者问题 进队出队 生产者消费者 42Java的多线程机制 6线程的同步与互斥 4wait()与notify() Object类的方法:public final void wait():令当前线程挂起并放弃管程,同步资 源解锁,使别的线程可访问并修改共享资源 ,而当前线程排队等候再次对资源的访问 notify()唤醒正在排队等待资源管程的线程中 优先级最高者,使之执行并拥有资源的管程 wait() + notify() + 标志变量:可协调、同步不 同线程的工作 43Java的多线程机制 6线程的同步与互斥 主线程 线程1( ) 线程2( ) 操作对象 共享数据(队) synchronized 同步方法1(生产) wait() notify() synchronized 同步方法2(消费) wait() notify() 44Java的多线程机制 6线程的同步与互斥 public final void wait() 方法 4在当前线程中调用方法: 对象名.wait() 4使当前线程进入等待(某对象)状态 ,直到另一线程 对该对象发出notify(或notifyAll)为止。 4调用方法的必要条件:当前线程必须具有对该对象的 监控权(加锁) 4当前线程将释放对象监控权 ,然后进入等待队列( wait队列)。 4在当前线程被notify后,要重新获得监控权,然后从断 点处继续代码的执行。 45Java的多线程机制 6线程的同步与互斥 public final void notify() 方法 4在当前线程中调用方法: 对象名.notify() 4功能:唤醒等待该对象监控权的一个线程。 4调用方法的必要条件:当前线程必须具有对该对象 的监控权(加锁) notifyAll() 4唤醒wait队列中的所有线程,并把它门移入锁申请 队列。 46Java的多线程机制 6线程状态 新建状态 就绪状态 start() 等待状态 执行状态 CPU调度 run() 结束 消亡 等待状态 对象wait()池 等待状态 对象lock池 wait() notify() synchronized() 解锁 sleep() join() yield() 47Java的多线程机制 6线程调度 4public static void sleep(long millis) 当前进程休眠指定时间 4public static void yield() 主动让出CPU,重新排队 正在执行的线程将CPU让给其他具有相同优先 级的线程,自己进入就绪状态重新排队 4public final void join() 等待某线程结束 48Java的多线程机制 6等待另一线程结束 Runnable ot = new otheeThread() ; Thread tt = new Thread(ot) ; tt.start(); /执行自己的工作 try tt.join () ; catch( interruptedException e) . /继续做自己的事 49Java的多线程机制 6终止线程 public class R implement Runnable private boolean timeToQuit=false ; /设标记 public void run() while (! timeToQuit ) public void stopRunning() timeToQuit=true; public class test public static void main(String args ) Runnable r = new R(); Thread t = new Thread(r) ; t.start() ; if () r.stopRunning() ; 50Java的多线程机制 6线程的同步与互斥 4Wait_Notify 程序CubbyHole.java 4创建用户的线程子类 Producer:产生数据(存数据); Consumer:消费数据(取数据) 4CubbyHole类,共享数据区,同步方法 put(int value)方法 int get()方法 4主类中创建共享数据对象,并启动两线程 51Java的多线程机制 6class CubbyHole private int seq; / 共享数据 private boolean available = false; / 条件标志变量 public synchronized int get() /取数据的同步方法get() while( available= =false ) try wait( ); /条件不符合,则wait catch( InterruptedException e ) available = false; /修改条件 notify( ); /通知唤醒其他等待管程的线程 return seq; /返回要取出的数值 /end of get() 52Java的多线程机制 6 /存放数据的同步方法put() public synchronized void put(int value) while( available= =true ) try wait( ); /条件不符合,则wait catch( InterruptedException e ) seq = value; /把共享变量修改为要放置的数据 available = true; /修改条件 notify( ); /通知唤醒其他等待管程的线程 /end of put() /end of class CubbyHole 53Java的多线程机制 6 class Producer extends Thread /生产者线程类 private CubbyHole cubbyhole; private int number; public Producer(CubbyHole c, int number) cubbyhole = c; this.number = number; public void run() /定义run()方法 for (int i = 0; i 10; i+) /共产生10个 cubbyhole.put(i); System.out.println(“Producer #“+this.number + “ put: “ + i); try sleep(int)(Math.random() * 100); catch (InterruptedException e) /end of class Producer 54Java的多线程机制 6 class Consumer extends Thread /消费者线程类 p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 水彩莲蓬线描荷花课件
- 口岸操作知识培训总结
- 2025新型医疗器械产品全国推广与市场开发合同
- 2025年度装配式工业车间建造与配套智能化设备承包协议
- 2025年装配式建筑构件租赁及配套施工管理合同
- 2025年豪华车型二手车交易鉴定与价值评估服务合同
- 2025年学校食堂废弃物资源化利用与无害化处理专业服务协议
- 2025年度绿色生态停车场建设与运营管理合同
- 2025年特色民宿资产产权转让及全方位运营维护管理合同
- 2025年智能家电产品全国推广及区域代理销售合同
- 医院食堂管理方案计划书
- 大客户营销管理策略对提高客户满意度和忠诚度的影响
- 《螺纹的种类和应用》课件
- 医学一等奖《白血病》课件
- 高空作业车专项应急预案
- 发现普洱茶的第一个医学实验报告
- 全自动血液细胞分析仪参数
- (完整版)过去完成时ppt
- 1输变电工程施工质量验收统一表式(线路工程)
- 养老护理员(技师、高级技师)知识考试复习题库(含答案)
- 学校安全“日管控、周排查、月总结”工作制度
评论
0/150
提交评论