《补充多线程机制》PPT课件.ppt

上传人:sh****n 文档编号:12759940 上传时间:2020-05-22 格式:PPT 页数:20 大小:221.50KB
返回 下载 相关 举报
《补充多线程机制》PPT课件.ppt_第1页
第1页 / 共20页
《补充多线程机制》PPT课件.ppt_第2页
第2页 / 共20页
《补充多线程机制》PPT课件.ppt_第3页
第3页 / 共20页
点击查看更多>>
资源描述
第10章:多线程机制,概述,在计算机编程中,一个基本的概念就是同时对多个任务加以控制,它们要求将问题划分,进入独立运行的程序片断中,使整个程序能更迅速地响应用户的请求。在一个程序中,这些独立运行的片断叫做“线程”(Thread)。正如字面上所表述的那样,多线程就是同时有多个线程在执行。在多CPU的计算机中,多线程的实现是真正的物理上的同时执行。而对于单CPU的计算机而言,实现的只是逻辑上的同时执行。在每个时刻,真正执行的只有一个线程,由操作系统进行线程管理调度,但由于CPU的速度很快,让人感到像是多个线程在同时执行。,10.1多线程,10.1.1线程的概念进程(process):一般来说,我们把程序的一次执行称为进程。一个进程包括一个程序模块和该模块一次执行时所处理的数据。线程(thread):是指进程内部一段可独立执行的有独立控制流的指令序列。也可以这样理解,我们把正在计算机中执行的程序叫做进程,而把程序代码的执行位置叫做线程,把程序用了多少内存或是打开了多少文件等系统资源的集合叫做任务。线程的划分尺度小于进程,使得多线程程序的并发性高,那么一个任务中可以没有线程,因为系统资源可以单独存在,就是你不用它,它仍然存在;但任何一个线程一定存在于某个任务中,因为代码执行一定会用到资源。多进程与多线程是多任务的两种类型。Java通过提供Package类(java.lang.package)支持多进程,而提供Thread类来支持多线程。多线程的意义在于在一个应用程序中,有多个执行部分可以同时执行。但多进程中,操作系统并没有将多个线程看做多个独立的应用。这也是进程与线程的重要区别。多线程优点:多线程比多进程更方便于共享资源,而Java又提供了一套先进的同步原理解决线程之间的同步问题,使得多线程设计更易发挥作用。,10.1.2线程类(Thread)Thread的成员变量有以下三个:publicfinalstaticinMAX_PRIORITY=10线程可设定的最高优先值为10。publicfinalstaticinMIN_PRIORITY=1线程可设定的最低优先值为1。publicfinalstaticinNORM_PRIORITY=5线程可设定的正常优先值为5。,Thread类的比较常用的构造函数形式如下:publicThread()配置一个新的线程对象。publicThread(Runnabletarget)配置一个新的线程对象,调用可执行类对象target中的run()方法。publicThread(Runnabletarget,Stringname)配置一个新的线程对象,调用可执行类对象target中的run()方法,并设线程的名称为name。publicThread(Stringname)配置一个新的线程对象,并设线程的名称为name。publicThread(ThreadGroupgroup,Runnabetarget)配置一个属于group线程组的新的线程对象,调用可执行类对象target中的run()方法。publicThread(ThreadGroupgroup,Runnabetarget,Stringname)配置一个属于group线程组的新的线程对象,调用可执行类对象target中的run()方法,并设线程的名称为name。publicThread(ThreadGroupgroup,Stringname)配置一个属于group线程组的新的线程对象,并设线程的名称为name。,Thread类的比较常用的方法形式如下:publicstaticintactiveCount()返回在线程群中活动线程的数量。publicstaticnativeThreadcurrentThread()返回目前正在活动的线程。publicstringgetName()返回线程的名称。publicintgetPriority()返回当前线程的优先级。publicvoidsetPriority()设置线程执行的优先级值。publicThreadGroupgetThreadGroup()返回当前线程所属的线程群。publicvoidinterrupt()中断当前线程。publicstaticBooleaninterrupted()返回线程是否被中断运行,是则返回true,否则返回false。booleanisInterupted()返回当前线程是否被中断,是则返回true,否则返回false。publicBooleanisAlive()返回线程是否存活,是则返回true,否则返回false。,publicisDaemon()返回当前线程是否为守护线程,是则返回true,否则返回false。publicvoidsetDaemon()设置线程为守护线程。publicvoidsetName(Stringname)设置线程的名称。publicvoidresume()恢复线程的运行状态。publicvoidrun()线程启动。publicvoiddestroy()结束线程的运行。publicstaticvoidsleep(longmillis)设置线程睡眠millis毫秒。publicstaticvoidsleep(longmillis,innanos)设置线程睡眠millis毫秒加nanos微秒。publicvoidstart()启动线程的运行。publicvoidstop()终止线程的运行。publicvoidsuspend()暂停(挂起)线程。publicstaticvoidyield()退出线程执行,将执行权交给其他的线程。,10.2线程的状态,一个完整线程的生命周期大概经历线程建立状态、可执行状态、阻塞状态、死亡状态这四个状态。建立状态:当一个线程通过newThread()被创建时,系统还没有为其分配任何资源,这时可调用了start()方法来启动,进入可执行状态;或是调用stop()方法进入死亡状态。可执行状态:由于start()方法的启动,并配置给予系统资源,进程进入排队等待执行,并且调用run()方法准备执行。Java按照优先级的顺序来安排处理等待执行的线程。调用yield()方法可以将执行权交给其他的线程;通过调用sleep()、wait()、suspend()等方法时将从可执行状态转成阻塞状态;调用stop()方法或run()方法执行完毕进入死亡状态。,阻塞状态:此时线程不仅等待分享处理器资源,而且在等待某个能使它返回可运行状态的事件。调用suspend()挂起的进程就要等待方法resume()方可被唤醒;调用sleep方法进入休眠的线程,必须等待休眠时间结束后才能进入可执行状态;调用wait()而休息的必须等候notify()通知才能进入可执行状态;如果由于输入输出流发生阻塞的情况必须等待输入输出已经完成,才能重新成为可执行的状态。死亡状态:当调用了stop()方法或线程执行完毕,则线程进入死亡(dead)状态。,线程的各个状态之间的转换关系图。,10.3多线程的实现,Java通过java.lang.Thread类来支持多线程,并且在Thread类中封装了独立的有关线程执行的数据和方法,并将多线程与面向对象的结构合为一体。Java提供了两种方式来实现多线程,一种是继承Thread类,另一种则是利用接口Runnable。,1.继承Thread类通过继承Thread类创建线程比较简单,可以按以下步骤进行。生成类Thread的子类。在子类中覆盖run()方法。生成子类的对象,并且调用start()方法启动新线程。程序的一般结构如下:classMyThreadextendThreadMyThread(Stringname)/调用Thread类的构造函数super(name);publicvoidrun()/线程执行的内容用以下代码创建并执行新线程:MyThreadmthread=newMyThread(“mthread”)/mthread是你要创建的新线程名mthread.start();,例子1importjava.lang.Thread;publicclassThreadsonpublicstaticvoidmain(Stringargs)/创建了两个线程athread和bthreadMyThreadathread=newMyThread(athread,30);MyThreadbthread=newMyThread(bthread,60);/开始执行线程athread.start();bthread.start();if(athread.isAlive()=false)/最好增加一些注释catch(InterruptedExceptionIE),例子2importjava.awt.*;importjava.applet.Applet;publicclassThreadGameextendsAppletinti=0;publicvoidpaint(Graphicsg)i=(i+2)%360;Colorc=newColor(3*i)%255,(7*i)%255,(11*i)%255);/得到颜色值g.setColor(c);g.fillArc(30,50,120,100,i,2);/画扇形g.fillArc(30,152,120,100,i,2);/画扇形tryThread.sleep(100);catch(Exceptione)repaint();publicvoidupdate(Graphicsg)g.clearRect(30,152,120,100);/设定绘图区域paint(g);/绘图,2.实现Runnable接口因Java的类规定只能继承一个类,所以有些时候当我们的类已经继承了其他类时,比如已经继承了Applet类,那么就不能再继承Thread类了,此时要使用类java.lang.Runnable中的接口Runnable来创建线程。使用接口创建线程的步骤如下:程序的一般结构如下:classMyRunThreadimplementsRunnablepublicvoidrun()/执行操作/实例化MyRunThreadr=newMyRunThread();/创建线程类Threadmthread=newThread(r);/启动线程mthread.start();,例子1publicclassThreadRblepublicstaticvoidmain(Stringargs)Rr1=newR(30);Threadathread=newThread(r1);Rr2=newR(30);Threadbthread=newThread(r2);athread.start();bthread.start();if(athread.isAlive()=false,例子2importjava.applet.Applet;importjava.awt.*;publicclassThreadRoundextendsAppletimplementsRunnableThreadleft,right;Graphicsmypen;intx,y;publicvoidinit()left=newThread(this);right=newThread(this);x=10;y=10;mypen=getGraphics();publicvoidstart()left.start();right.start();,publicvoidrun()while(true)if(Thread.currentThread()=left)x=x+1;if(x240)x=10;mypen.setColor(Color.BLUE);mypen.clearRect(10,10,300,42);mypen.drawRect(10+x,10,40,40);tryThread.sleep(60);catch(Exceptione)elseif(Thread.currentThread()=right)y=y+1;if(y240)y=10;mypen.setColor(Color.red);mypen.clearRect(10,90,300,42);mypen.drawOval(10+y,90,40,40);tryThread.sleep(60);catch(Exceptione)publicvoidstop()left=null;right=null;,10.4线程同步,由于应用程序可能拥有多个线程同时在执行,每个线程在执行过程中共享相同的资源,因为线程执行的速度无法预知,所以对于共用数据的插入、删除、更新等操作的线程来说,你所取得的数据可能不正确。比如:可能A线程正在更新,但还没有更新完成,B线程却把数据取走了,这个时候,数据当然是不对的了。基于以上情形,Java在多线程应用中,为了保护数据的一致性,提供了自己协调资源的方法,即引入了同步的概念。Java通过在方法声明中加入synchronized关键字来实现同步的。凡是使用synchronized关键字的方法、对象或类数据,在任何一个时刻只能被一个线程使用,以此达到线程同步的目的。实现线程同步的一般程序结构如下:publicsynchronizedvoidMymethod()/你程序的代码,例子importjava.lang.Thread;publicclassThreadSyncpublicstaticvoidmain(Stringargs)/创建了两个线程athread和bthreadSyThreadathread=newSyThread(athread,30);SyThreadbthread=newSyThread(bthread,60);/开始执行线程athread.start();bthread.start();if(athread.isAlive()=false,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!