资源预览内容
第1页 / 共32页
第2页 / 共32页
第3页 / 共32页
第4页 / 共32页
第5页 / 共32页
第6页 / 共32页
第7页 / 共32页
第8页 / 共32页
第9页 / 共32页
第10页 / 共32页
第11页 / 共32页
第12页 / 共32页
第13页 / 共32页
第14页 / 共32页
第15页 / 共32页
第16页 / 共32页
第17页 / 共32页
第18页 / 共32页
第19页 / 共32页
第20页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
点击查看更多>>
资源描述
Click Here,Click here,Click here,Click here,Click here,Click here,第,11,讲,Java,多线程,一,、,进程与,线程,进程一般是对操作系统而言的,。例如,你打开,word,编辑文档,同时打开,outlook,收取邮件。我们可以说这时系统内有两个进程在运行。即,多个程序,几乎在同一时间执行多个任务。,线程一般是对某一程序而言的,。如上例,你打开,outlook,收新邮件的同时,还可以看已下载的邮件,这两件事没有相互干扰,那么我们说此时这一程序中至少有两个线程在运行。即,每一个程序,在同一时间内执行多个任务。,从逻辑的观点来看,多线程意味着一个程序的多行语句同时执行,,但是多线程并不等于多次启动一个程序,操作系统也不会把每个线程当作独立的进程来对待,。,一、,进程与线程,两者的粒度不同,是两个不同层次上的概念。进程是由操作系统来管理的,而线程则是在一个程序(进程)内。,(可以看看,win2000,的任务管理器),不同进程的代码、内部数据和状态都是完全独立的,,而一个程序内的多线程是共享同一块内存空间和同一组系统资源,有可能互相影响,。,线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担要小。,二,、,多线程,单线程,多线程,进程,传统进程,多线程进程,多线程的优势,减轻编写交互频繁、涉及面多的程序的困难(如监听网络端口)。,程序的吞吐量会得到改善(同时监听多种设备,如网络端口、串口、并口以及其他外设)。,有多个处理器的系统,可以并发运行不同的线程(否则,任何时刻只有一个线程在运行)。,三、线程的调度,调度策略,时间片,抢占式:高优先级的线程抢占,CPU,Java,的调度方法,同优先级线程组成先进先出队列,使用时间片策略,对高优先级,使用优先调度的抢占式策略,。,因此,,java,的线程调度是不分时的,同时启动多个线程,后,不能保证各个线程轮流获得均等的,CPU,时间片。,Java,中,线程的优先级实际上无法保障线程的执行次序。只不过,,优先级高的线程获取,CPU,资源的概率较大,,优先级低的并非没机会执行。,线程的调度不是跨平台的,它不仅仅取决于,java,虚拟机,还依赖于操作系统。,1,2,四,、,java,线程模型,虚拟的,CPU,,由,java.lang.Thread,类封装和虚拟,CPU,来实现。,CPU,所执行的代码,传递给,Thread,类对象。,CPU,所处理的数据,传递给,Thread,类对象。,代 码,数 据,虚拟,CPU,Java,线程模型,五、主线程,在任何,Java,程序启动时,一个线程立刻运行(即,main,方法对应的线程),该线程通常称为程序的主线程。,主线程的特点:,它是产生其他子线程的线程。,它不一定是最后完成执行的线程,子线程可能在它结束之后还在运行。,一个普通的程序,顺序执行,class CommonTest1,public static void,main(String,args,),A a1=new A(a1,1000);,A a2=new A(a2,1000);,a1.tt();a2.tt();,a2.setCount(2000);,class A,private,int,count;private String,sflag,;,public A(),public,A(String,sflag,int,count),this.sflag,=,sflag,;,this.count,=count;,protected,int,getCount,()return count;,protected void,setCount(int,count),this.count,=count;,protected String,getSflag,()return,sflag,;,protected void,setSflag(String,sflag,),this.sflag,=,sflag,;,public void,tt,(),for(,int,i=0;i,count;i,+),System.out.println,(A in:+,sflag,+now is:+i);,六、,创建线程,通过,java.lang.Thread,来创建一个线程,Thread,的构造器:,Thread(),Thread(Runnable target),Thread(Runnable target,String name),Thread(String name),Thread(ThreadGroup group,Runnable target),Thread(ThreadGroup group,Runnable target,String name),Thread(ThreadGroup group,String name),七、,启动线程,每个线程都是通过某个特定,Thread,对象所对应的方法,run(),来完成其操作的,方法,run(),称为线程体。,使用,start(),方法,,线程进入,Runnable,(可运行)状态,它将向,线程调度,器注册这个线程。,调用,start(),方法并不一定马上会执行这个线程,正如上面所说,它只是进入,Runnable,而不是,Running,。,注意,不要直接在程序中调用线程的,run(),方法。,创建并启动线程例子(例,:TestThread,),public class TestThread extends Thread,public void run(),for(int i=0;i100;i+),System.out.println(Count:+i);,public static void main(String args),TestThread,tt=new TestThread();,/,注意,不要直接调用,run,方法,tt.start();,八、,使用,Runnable,接口,通常有两种方式创建线程:,(,1,),使用,Runnable,接口,可以将,CPU,,代码和数据分开,形成清晰的模型;,还可以从其他类继承;,保持程序风格的一致性。,(,2,),直接继承,Thread,类,不能再从其他类继承;,编写简单,可以直接操纵线程,无需使用,Thread.currentThread(),。,由于继承了,Thread,后,类再不能继承别的类,(,即无法资源共享),,,所以一般我们采用实现,R,unnable,接口的方法来创建线程,。,具体步骤:,提供一个实现接口,Runnable,的类,实现,run(),方法。,得到这个类的实例,A,。,New,这个一个,Thread,对象,同时,A,作为参数传入。,例如:,Thread runner=new Thread(A);,调用,start,启动线程,例如:,runner.start();,用,Runnable,创建线程(例,:RunnableThread,),public class RunnableThread implements Runnable,/,实现接口,Runnable,中的,run,方法,public void run(),for(int k=0;k10;k+),System.out.println(Count:+k);,采用,extends Thread,方法创建线程,ThreadTest1,采用,implements,Runnable,方法创建线程,ThreadTest2,普通对象实现业务逻辑,继承对象实现,Runnable,ThreadTest3,九、创建多线程,public class,TestThread,/,主类,public static void,main(String,args,),Runner r=new Runner();,/,生成线程类对象,r,Thread t1=new,Thread(r,);,/,创建线程对象,t1,Thread t2=new,Thread(r,);,/,创建线程对象,t2,t1.start();,/,启动线程,t1,t2.start();,/,启动线程,t2,class Runner implements,Runnable,/,线程类,public void run(),for(int,i=0;i20;i+),System.out.,println(No,.+i);,十、,线程的优先级,线程的优先级用数字来表示,范围从,1,到,10,,即,Thread.MIN_PRIORITY,到,Thread.MAX_PRIORITY,。,一个线程的缺省优先级是,5,,即,Thread.NORM_PRIORITY,。下述方法可以对优先级进行操作:,int getPriority();/,得到线程的优先级,void setPriority(int newPriority);,/,当线程被创建后,可通过此方法改变线程的优先级,在一个线程中开启另外一个新线程,则新开线程称为该线程的子线程,子线程初始优先级与父线程相同。见下面的例题。,注意:并不是所有的操作系统都支持所有级别。永远,不要依赖优先级来决定你的线程运行顺序,。,public class Test public static void,main(String,args,)Thread t1=new MyThread1();Thread t2=new,Thread(new,MyRunnable,();,t1.setPriority(10);t2.setPriority(1);,t2.start();t1.start();,class,MyRunnable,implements,Runnable,public void run()for(,int,i=0;i 10;i+),System.out.println,(,线程,2,第,+i,+,次执行!,);try Thread.sleep(100);catch(,InterruptedException,e),e.printStackTrace,();,class MyThread1 extends Thread public void run()for(,int,i=0;i 10;i+),System.out.println,(,线程,1,第,+i,+,次执行!,);try Thread.sleep(100);catch(,InterruptedException,e),e.printStackTrace,();,十一、线程的状态,线程共有下面,4,种状态:,1,、,new,(新建):,当你用,new,创建一个线程时,该线程尚未运行。,2,、,runnable,(可运行):,一旦调用了,start,方法,该线程便是一个可运行的线程。可运行的线程可以尚未执行,也可以正在执行,取决于线程调度的结果。(,java,文档并不将正在运行的情况视为一个专门的状态),3,、,blocked,(被中断运行):,当出现下列操作之一时,线程便进入中断状态:,有人调用该线程的,sleep(),方法,;,该线程调用了,wait(),方法,;,该线程调用了一个在输入输出时中断的操作,也就是说,在输入和输出操作完成之前,该操作不会返回到它的调用程序;,该线程试图锁定一个当前被另一个线程锁定了的对象,4,、,dead,(死亡):,由于下面两个原因,线程将变成死线程:,由于,run,方法的正常退出而自然死亡;,没有捕获到的异常事件终止了,run,方法的执行,从而导致线程突然死亡;,十一、线程的状态,一旦线程开始运行,它不必始终保持运行状态,。实际上,正在运行的线程,有时需要被中断,,这样其它线程就有机会可以运行了。,若要,确定某个线程当前是否活着,(也就是说确定它是否处于可运行状态或者被中断状态),可以,使用,isAlive,方法,。如果该线程是可运行线程或者被中断线程,那么该方法返回,tr
点击显示更多内容>>

最新DOC

最新PPT

最新RAR

收藏 下载该资源
网站客服QQ:3392350380
装配图网版权所有
苏ICP备12009002号-6