第七章多钱程机制

上传人:豆浆 文档编号:47588484 上传时间:2018-07-03 格式:PPT 页数:43 大小:260KB
返回 下载 相关 举报
第七章多钱程机制_第1页
第1页 / 共43页
第七章多钱程机制_第2页
第2页 / 共43页
第七章多钱程机制_第3页
第3页 / 共43页
第七章多钱程机制_第4页
第4页 / 共43页
第七章多钱程机制_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《第七章多钱程机制》由会员分享,可在线阅读,更多相关《第七章多钱程机制(43页珍藏版)》请在金锄头文库上搜索。

1、第七章 Java的多线程机制v程序是一段静态的代码,它是应用程序 执行的蓝本进程是程序的一次动态执行,它对应了 从代码加载、执行至执行完毕的一个完 整过程 线程 是进程执行过程中产生的多条执行 线索 线程是比进程执行更小的单位7.1什么是线程 一。程序、进程与线程例:ThreadTest.javavclass StudentThread extends Thread vpublic void run()vv for(int i=0;i100)t=0;redPen.clearRect(0,0,110,400);redPen.fillOval(50,(int)(1.0/2*t*9.8),15,15

2、);tryred.sleep(40);catch(InterruptedException e)else if(Thread.currentThread()=blue)bluePen.clearRect(120,0,900,500);bluePen.fillOval(120+7*t,(int)(1.0/2*t*9.8),15,15);tryblue.sleep(40);catch(InterruptedException e) 线程机制实现的关键在于它的“并行性 ”,怎样才能让一个线程让出CPU,供其它线 程使用呢? API:start() 启动线程对象 run()用来定义线程对象被调度之后所

3、执行的操作,用户必须重写run()方法 yield()强制终止线程的执行 isAlive()测试当前线程是否在活动 sleep(int millsecond)使线程休眠一段时间, 长短由参数所决定 Void Wait() 使线程处于等待状态7.3.1 线程的生命周期新建(new)线程对象刚刚创建,还没有启 动,此时还处于不可运行状态。如:7.3线程的属性Thread thread=new Thread(“test”)此时线程thread处于新建状态但已有了相应的内存空间以及其它资源线程一共有四种状态:新建(new)可运行状态(runnable)死(dead)堵塞(blocked)可运行状态(r

4、unnable)此时的线程可能运行,也可能不运行, 取决于CPU是否空闲。调用线程的start()方法可使线程处于“可运 行”状态thread.start();此时的线程已经启动,控制已处于线程的 run()方法之中二是当线程处于“可运行”状态时,调 用了stop()方法结束了线程的运行,使其 进入了死状态。thread.stop();线程死亡的原因有二: 一是run()方法中最后一个语句执行完毕死(dead)一个正在执行的线程因特殊原因,被暂停 执行,进入堵塞状态堵塞时线程不能进入队列排队,必须等到引 起堵塞的原因消除,才可重新进入排队队列引起堵塞的原因很多,不同原因要用不同 的方法解除sl

5、eep(),wait()是两个常用引起堵塞的方法堵塞(blocked)v当run()执行结束返回时,线程自动终止v使用stop()也可以终止线程的执行v在程序中常常调用interrupt()来终止线程,vinterrupt()不仅可中断正在运行的线程,v而且也能中断处于blocked状态的线程,v此时interrupt()会抛出一个 InterruptedException异常vJava提供了几个用于测试线程是否被中断的 方法7.3.2. 线程中断vAPI:vjava.lang.ThreadvVoid interrupt()v向一个线程发送一个中断请求,同时把这 个线程的“interrupte

6、d”状态置为true.v若该线程处于blocked状态,会抛出 InterruptedException.vStatic boolean interrupted()v检测当前线程是否已被中断,并重置状态 “interrupted”值为falseboolean isInterrupted() 检测当前线程是否已被中断,不改变状态 “interrupted”值 例:一个多线程的例子BounceThread.javaclass Ball extends Thread public Ball(JPanel b) box=b;public void run() try draw();for(int i=

7、1;i=1000;i+) move();sleep(5);catch(InterruptedException e) addButton(p,“Start“,new ActionListener()public void actionPerformed(ActionEvent evt)Ball b=new Ball(canvas);b.start(););Java 的线程调度采用优先级策略: 优先级高的先执行,优先级低的后执行;多线程系统会自动为每个线程分配一个 优先级,缺省时,继承其父类的优先级 任务紧急的线程,其优先较高 优先级的线程按“先进先出”的原则7.4线程优先级BounceExpr

8、ess.java垃圾回收是一个优先级很低的线程,当 CPU空闲,又没有别的高优先级线程在 运行,此时垃圾回收被线程被激活Thread类有三个与线程优先级有关的静 态量: MAX_PRIORITY:最大优先权,值为10 MIN_PRIORITY:最小优先权,值为1 NORM _PRIORITY:默认优先权,值为5API:java.lang.Thread Void setPriority(int newPriority)重置线程优先级 Int getPriority()获得当前线程优先级 Static void yield()使当前线程放弃执行权用setPriority()改变线程的优先级例:Bo

9、unceExpress.javaaddButton(p,“Start“,new ActionListener()public void actionPerformed(ActionEvent evt) Ball b=new Ball(canvas,Color.black);b.setPriority(Thread.NORM_PRIORITY);b.start(););addButton(p,“Express“,new ActionListener()public void actionPerformed(ActionEvent evt)for(int i=0;i5;i+)Ball b=new

10、Ball(canvas,Color.red);b.setPriority(Thread.NORM_PRIORITY+2);b.start();); 7.5线程同步 案例:会计和出纳同用一帐本的情况会计负责存款、出纳负责取款假设,会计每次存入30万,共存三 次;然后出纳开始取款,每次取会计存 款的一半,共取二次;这个过程一共重 复三次。如果帐面原来有100万,那么会计、 出纳操作完后,帐面应该如下:会计第 一次存 款后会计第 三次存 款后会计第 二次存 款后出纳第 二次取 款后出纳第 一次取 款后出纳第 三次取 款后2、用money表示帐本,会计、出纳都 要对其操作 3、设计一个 chunqu方

11、法,会计、出 纳利用这个方法对帐本money进行操作问题分析:1、设计两个线程,一个表示会计 kuaiji、一个表示出纳 chuna程序设计如下:public void run()if(Thread.currentThread()=kuaiji|Thread.currentThread()=chuna) for(int i=1;i=3;i+) chunqu(30); public void start() kuaiji.start(); chuna.start();public void chunqu(int number) if(Thread.currentThread()=kuaiji)f

12、or(int i=1;i=3;i+)money=money+number;tryThread.sleep(1000);catch(InterruptedException e)text1.append(“n“+money); else if(Thread.currentThread()=chuna)for(int i=1;i=2;i+)money=money-number/2;tryThread.sleep(1000);catch(InterruptedException e)text2.append(“n“+money); 运行结果:存在问题:在大多数实用线程应用中,都 存在 两个或两个以上

13、的线程对同一个对象进行 操作的情形,假设每个线程都调用了改变 它状态的方法,就会产生这样的结果。 解决:引入线程同步机制- synchronized 用synchronized修饰的方法,当一个 线程要使用该方法,就只能等待其它线程 使用完后,方可使用。public synchronized void chunqu(int number)if(Thread.currentThread()=kuaiji)for(int i=1;i=3;i+) money=money+number;tryThread.sleep(1000);catch(InterruptedException e)text1.a

14、ppend(“n“+money); .7.6wait()、notify()和notifyall()方法案例:一个售票的例子本周上映影片天下无贼票价:五元Student1:用20元买票,售票员找不开 钱,student1只能等待其它student2用 零钱来买票,以便售票员可以把钱找 开问题可归纳为:当一个线程使用的同步方法中用到某 个变量,而该变量需要等到其它线程修改 后才能符合本线程的需要,此时要用 wait()方法,使其处于阻塞状态当其它线程使用该方法,对该变量进 行修改后,引起阻塞的原因解除,此时 可用notify()或notifyall()方法通知等待使 用该方法的线程结束等待,继续执

15、行问题分析:1、设计两个线程,一个表示student1 、一个表示student22 变量five=2、ten=0、twenty=0表 示五元、十元和二十元的张数3、方法售票规则用来实现卖票过程 ,返回值是一个Stringpublic synchronized String 售票规则(String stu,int money)if(money=5)five=five+1;s=stu+“给您入场券“+“您的钱正好“;else if(money=20)while(five3)trywait();catch(InterruptedException e)five=five-3;twenty=twen

16、ty+1; s=stu+“给您入场券“+“ 您给我20 ,找您15元“;notifyAll();return s; public void run() if(Thread.currentThread()=student1)String s=sellperson.售票规则(“student1:“,20);text.append(“n“+s);else if(Thread.currentThread()=student2)String s=wang.售票规则(“student2:“,5);text.append(“n“+s);总结:1、多线程的概念2、多线程的实现方法3、线程的生命周期4、线程的调度原则5、sleep 、wait方法6、同步机制

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 毕业论文

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