资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第,9,章,Java,线程,9.1,并行程序设计,知识要点,线程的概念,线程的状态,线程,的,调度,实例,实现两个并行运行的线程。,1,详细设计,class Thread1 extends Thread,run(),while(true),休眠,800ms,并输出,-First Thread-;,class Thread2 extends Thread,run(),while(true),休眠,1000ms,并输出,-Second Thread-;,class TwoThreadTest,public static void main(String args),分别实例化,Thread1,和,Thread2,对象并启动;,2,编码实现,1),休眠,800ms,并输出,-First Thread-,语句:,sleep(800);,System.out.println(-First Thread-);,分析:,Thread,的方法,run(),是线程运行程序的主体,方法,sleep(),可以实现休眠,单位是毫秒。在,run(),方法中,这两行语句放入死循环,所以只要启动这样线程,就每,800ms,输出,-First Thread-,。,2),休眠,1000ms,并输出,-Second Thread-,语句:,sleep(1000);,System.out.println(-Second Thread-);,分析:同样,这两行语句放在死循环中,所以只要启动这样线程,就每,1000ms,输出,-Second Thread-,。,3),分别实例化,Thread1,和,Thread2,对象并启动,语句:,Thread1 t1=new Thread1();,Thread2 t2=new Thread2();,t1.start();,t2.start();,分析:线程用方法,start(),启动。,3,源代码,l,略。,4,测试与运行,5,技术分析,1)线程的概念,线程一个程序中可以同时运行的语句序列。Java通过线程实现了多任务的并发执行。,2)线程的实现,Java中可以用两种方式来创立线程,一种是实现Runnable接口,另一种是继承Thread类重写run()方法,前者保存了继承一个类的可能。,3)线程的状态,Java中的线程有四种状态分别是:运行、就绪、挂起、结束。,4)线程的调度,线程调度系统根据各个线程的优先级来决定给谁分配CPU时间。,6.,问题与思考,用实现接口Runnable的方式,实现本节实例程序。,9.2,动画实现,知识要点,动画的实现,处理闪烁,声音和图像并行播放,实例,编写,Java Applet,程序,使字符串自左向右移动。,1详细设计,public class Animation extends Applet implements Runnable,定义变量;,/Applet的start()方法,public void start(),创立线程并启动;,/Applet的stop()方法,public void stop(),终止动画线程;,/线程的run()方法,public void run(),每300毫秒不断截取子串并发出重画请求;,public void paint(Graphics g),重画每帧图;,2输出文字编码实现,1)创立线程并启动,语句:,if(animationthread=null),animationthread=new Thread(this);,animationthread.start();,分析:这个过程在start()方法中实现,所以一旦启动Applet,就启动了该线程。,2)终止动画线程;,语句:,if(animationthread!=null),animationthread.stop();,animationthread=null;,分析:Applet的stop()方法处理Applet结束的工作,这里需要终止处理动画线程序。,3),每,300,毫秒不断截取子串并发出重画请求,语句:,while,(,true,),begin-;,/,如果字符串已取完,又从倒数第一个开始取,if,(begin0),begin=str.length()-1;,repaint();,try,Thread.,sleep,(300);,catch,(InterruptedException e),分析:,begin,表示子串的起点,,repain(),会自动调用,paint(),方法实现重画。,4),清屏每帧图,语句:,g.setFont(font);,g.setColor(Color.,red,);,g.drawString(str.substring(begin,str.length(),2,60);,分析:用设置的字体和颜色画字符串。,3,源代码,略。,4,测试与运行,5,技术分析,1)动画的实现,Java 用Java.awt 包中的 Graphics 类的drawImage()方法在屏幕上画出图像,然后通过定义一个线程,让该线程睡眠一段时间,再切换成另外一幅图像;如此循环,在屏幕上画出一系列的帧来造成运动的感觉,从而到达显示动画的目的。,2)处理闪烁,闪烁有两个原因:一是绘制每一帧花费的时间太长;二是在每次调用paint()前,Java 会用背景颜色重画整个画面,当在进行下一帧的计算时,用户看到的是背景。,有两种方法可以减弱闪烁:重载 update()或使用双缓冲。,3)声音和图像并行播放,启动动画线程后,立即用sound.loop()播放声音即可实现声音和图像并行播放。其中,sound是一个AudioClip对象。,6.,问题与思考,利用本节实例,实现显示动画的同时,播放一段音乐。,9.3,分别对堆栈进行压入和出栈的并行程序,知识要点,Daemon,线程,线程组,实例,分别用两个线程进行压栈和出栈操作。,1,详细设计,class PushThread extends Thread,域变量定义;,构造方法;,public void run(),String obj;,try,while(true),800,毫秒后获取一个数压入堆栈;,catch(InterruptedException e),setCode()/,生成一个数据,String getCode()/,返回当前处理的数据,class PopThread extends Thread,域变量定义;,构造方法;,public void run(),try,while(true),每隔,1000,毫秒弹出一个对象;,catch(InterruptedException e),class PushPopThreadTest,public static void main(String args),实例化,PushThread,和,PopThread,线程并启动;,2,编码实现,1),域变量定义,语句:,VectorStack vs;,static String basecode=000;,String code;,分析:,vs,是一个,VectorStack,,,basecode,是压入数据的基数,,code,是当前处理的数据。,2),构造方法,语句:,PushThread(VectorStack vs),this.vs=vs;,分析:使处理的,VectorStack,对象指向传送来的一个,VectorStack,对象。该对象应该和当前,PopTread,线程处理的是一个,VectorStack,对象。,3)800,毫秒后获取一个数压入堆栈,语句:,sleep(800);,setCode();,obj=getCode();,vs.push(obj);,分析:,setCode(),用递增的方式生产数据,,getCode(),获取这个数据对象。,4)setCode(),方法,语句:,void setCode(),int icode;,icode=Integer.parseInt(basecode)+1;,if(icode10),basecode=00+Integer.toString(icode);,else if(icode=CAPACITY),wait();,分析:在一个时刻,只能有一个线程访问方法,push(Object obj),,所以必须在方法,push(Object obj),前使用关键字,synchronized,。,wait(),方法是在,Object,类中定义的,它可以让线程挂起。,4),把对象压入堆栈并唤醒因操作堆栈而等待的线程,语句:,v.addElement(obj);,System.out.print(PUSH:+obj);,notify();,分析:如果堆栈空,负责弹出的线程会因没有数据而等待。有数据压入后,用,notify(),唤醒因操作该堆栈而等待的线程序。,5),如果栈空就等待,语句:,while(v.size()=0),wait();,分析:如果没有数据弹出,,Pop(),方法只有等待。,6),弹出数据并唤醒因操作堆栈而等待的线程,语句:,Object obj=v.lastElement();,v.removeElementAt(v.size()-1);,System.out.println(Pop:+obj);,notify();,return obj;,分析:栈满时压入线程会等待,所以一旦弹出一个数据,立即唤醒等待线程。,3,源代码,略。,4,测试与运行,5,技术分析,1),线程同步,线程同步指某段程序只能有一个线程运行。也就是说只有当该线程运行结束后,其它线程才能运行。,2),线程交互,使用了关键字,synthronized,之后,就可以协调多个线程对某个方法或某个代码块的执行。如果要想让线程等待某个事件的发生然后继续执行的话,这就涉及到线程的交互。,Java,的类,Object,中通过,wait(),,,notify(),notifyAll(),来实现。,6.,问题与思考,实例中如果弹出的速度比压入的速度快会出现什么结果?适当修改程序,并解释结果。,
展开阅读全文