您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 招标投标 > Java线程及多线程技术及应用
第6章Java线程及多线程技术及应用6.1线程基本概念1、进程和线程的基础知识进程:运行中的应用程序称为进程,拥有系统资源(cpu、内存)线程:进程中的一段代码,一个进程中可以哦有多段代码。本身不拥有资源(共享所在进程的资源)在java中,程序入口被自动创建为主线程,在主线程中可以创建多个子线程。区别:1、是否占有资源问题2、创建或撤销一个进程所需要的开销比创建或撤销一个线程所需要的开销大。3、进程为重量级组件,线程为轻量级组件多进程:在操作系统中能同时运行多个任务(程序)多线程:在同一应用程序中有多个功能流同时执行2、线程的主要特点不能以一个文件名的方式独立存在在磁盘中;不能单独执行,只有在进程启动后才可启动;线程可以共享进程相同的内存(代码与数据)。3、线程的主要用途利用它可以完成重复性的工作(如实现动画、声音等的播放)。从事一次性较费时的初始化工作(如网络连接、声音数据文件的加载)。并发执行的运行效果(一个进程多个线程)以实现更复杂的功能4、多线程(多个线程同时运行)程序的主要优点可以减轻系统性能方面的瓶颈,因为可以并行操作;提高CPU的处理器的效率,在多线程中,通过优先级管理,可以使重要的程序优先操作,提高了任务管理的灵活性;另一方面,在多CPU系统中,可以把不同的线程在不同的CPU中执行,真正做到同时处理多任务。6.2线程创建与启动1、与线程编程有关的一些概念创建方式:1继承java.lang.Thread类2实现java.lang.Runnable接口线程体:publicvoidrun()方法,其内的程序代码决定了线程的行为和功能。线程启动:publicvoidstart(),线程启动后,需要获取cpu才能自动调用run()运行。线程休眠:publicvoidsleep(longms),线程将暂停,放弃cpu2、利用继承Thread类创建线程的示例packagecom.px1987.j2se.thread.base;/**通过Thread类实现多线程定义一个Thread的子类并重写其run方法.*/publicclassMyThreadextendsThread{@Overridepublicvoidrun(){while(true){System.out.println(invokeMyThreadrunmethod);}}publicstaticvoidmain(String[]args){//main方法测试线程的创建与启动MyThreadmyThread=newMyThread();//实例化MyThread的对象myThread.start();//调用myThread对象的start方法启动一个线程}}3、利用实现Runable接口创建线程的示例packagecom.px1987.j2se.thread.base;/**通过Runable接口实现多线程定义MyRunable类实现Runnable接口,并实现接口中的run方法。*/publicclassMyRunableimplementsRunnable{publicvoidrun(){while(true)System.out.println(invokeMyRunablerunmethod);}publicstaticvoidmain(String[]args){//main方法测试线程的创建与启动//建立MyRunable类的对象,以此对象为参数建立Thread类的对象Threadthread=newThread(newMyRunable());thread.start();//调用thread对象的start方法启动一个线程}}6.3线程的状态控制1、新建状态用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态。处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable)。2、就绪状态处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,处于线程就绪队列,等待系统为其分配CPU。等待状态并不是执行状态,当系统选定一个等待执行的Thread对象后,它就会从等待执行状态进入执行状态,系统挑选的动作称之为“cpu调度”。一旦获得CPU,线程就进入运行状态并自动调用自己的run方法。3、死亡状态死亡状态是线程生命周期中的最后一个阶段。线程死亡的原因有两个:一个是正常运行的线程完成了它的全部工作;另一个是线程被强制性地终止,如通过执行stop或destroy方法来终止一个线程。Methodstop()&destroy()intheclassThreadisdeprecated。当一个线程进入死亡状态以后,就不能再回到其它状态了。让一个Thread对象重新执行一次的唯一方法,就是重新产生一个Thread对象。4、体现线程状态转变的代码示例packagecom.px1987.j2se.thread.base;publicclassMyRunable1implementsRunnable{publicvoidrun(){while(true)System.out.println(invokeMyRunablerunmethod);}publicstaticvoidmain(String[]args){Threadthread=newThread(newMyRunable());//新生状态thread.start();//就绪状态,获得CPU后就能运行try{Thread.sleep(5000);}catch(InterruptedExceptione){e.printStackTrace();}thread.stop();//死亡状态}}通过查API可以看到stop方法和destory方法已经过时了,所以不能再用,那要怎样做才能强制的销毁一个线程呢?1、在run方法中执行return线程同样结束2、可以在while循环的条件中设定一个标志位,当它等于false的时候,while循环就不在运行,这样线程也就结束了。代码为实现的代码示例:packagecom.px1987.j2se.thread.StateControl;publicclassMyRunable2implementsRunnable{privatebooleanisStop;//线程是否停止的标志位publicvoidrun(){while(!isStop)System.out.println(invokeMyRunablerunmethod);}publicvoidstop(){//终止线程isStop=true;}publicstaticvoidmain(String[]args){MyRunablemyRunable=newMyRunable();Threadthread=newThread(myRunable);thread.start();try{Thread.sleep(5000);}catch(InterruptedExceptione){e.printStackTrace();}myRunable.stop();//正确的停止线程的方法}}5、阻塞状态处于运行状态的线程在某些情况下,如执行了sleep(睡眠)方法,或等待I/O设备等资源,将让出CPU并暂时停止自己的运行,进入阻塞状态。在阻塞状态的线程不能进入就绪队列。只有当引起阻塞的原因消除时,如睡眠时间已到,或等待的I/O设备空闲下来,线程便转入就绪状态,重新到就绪队列中排队等待,被系统选中后从原来停止的位置开始继续运行。有三种方法可以暂停Threads执行:(1)sleep方法可以调用Thread的静态方法:publicstaticvoidsleep(longmillis)throwsInterruptedException使得当前线程休眠(暂时停止执行millis毫秒)。由于是静态方法,sleep可以由类名直接调用:Thread.sleep(…)。下面为代码示例:packagecom.px1987.j2se.thread.p5;importjava.util.Date;importjava.text.SimpleDateFormat;classSleepTestimplementsRunnable{privatestaticSimpleDateFormatformat=newSimpleDateFormat(yyyy-MM-ddhh:mm:ss);publicvoidrun(){System.out.println(childthreadbegin);inti=0;while(i++5){System.out.println(format.format(newDate()));try{Thread.sleep(5000);}catch(InterruptedExceptione){e.printStackTrace();}}System.out.println(childthreaddeadat:+format.format(newDate()));}publicstaticvoidmain(String[]args){Runnabler=newSleepTest();Threadthread=newThread(r);thread.start();try{Thread.sleep(20000);}catch(InterruptedExceptione){e.printStackTrace();}thread.interrupt();System.out.println(mainmethoddead!);}}该程序的运行结果如下:childthreadbegin2009-02-0604:50:292009-02-0604:50:342009-02-0604:50:392009-02-0604:50:44mainmethoddead!java.lang.InterruptedException:sleepinterruptedatjava.lang.Thread.sleep(NativeMethod)atcom.px1987.j2se.thread.p5.Thread4.run(Thread4.java:17)atjava.lang.Thread.run(UnknownSource)2009-02-0604:50:49childthreaddeadat:2009-02-0604:50:54(2)yield方法让出CPU的使用权,从运行态直接进入就绪态。下面为代码示例:packagecom.px1987.j2se.thread.StateControl;classThread5implementsRunnable{privateStringname;Thread5(Strings){this.name=s;}publicvoidrun(){for(inti=1;i=50;i++){System.out.println(name+:+i);if(i%10==0){Thread.yield();}}}}packagecom.px1987.j2se.thread.StateControl;publicclassYieldTest{publicstaticvoidmain(String[]args){Runnabler1=newThread5(S1);Runnabler2=newThread5(S2);Threadt1=newThread(r1);Threadt2=newThread(r2);t1.start();t2.start();try{Thread.sleep(2);}catch(InterruptedExceptione){e.printStackTrace();}System.out.println(mainmethodover!);}}该程序的部分运行结果如下:S1:20S2:7S2:8S2:9S2:10S1:
本文标题:Java线程及多线程技术及应用
链接地址:https://www.777doc.com/doc-5197820 .html