您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 2016032803_多线程的常用操作方法
第(1)页共(5)页1、课程名称:多线程的常用操作方法2、知识点2.1、上次课程的主要知识点多线程的实现。2.2、本次预计讲解的知识点线程的命名操作、线程的休眠、线程优先级。3、具体内容(★★★★★)线程的所有操作方法几乎都在Thread类中定义好了。3.1、线程的命名和取得从本质上来讲多线程的运行状态并不是固定的。所以来讲要想确定线程的执行,唯一的区别就在于线程的名称上。第(2)页共(5)页在起名的时候就应该尽可能避免重名,或者避免修改名称。在Thread类中提供有如下的方法可以实现线程名称的操作:·构造方法:publicThread(Runnabletarget,Stringname)·设置名字:publicfinalvoidsetName(Stringname);·取得名字:publicfinalStringgetName()。既然线程的执行本身是不确定的状态,所以如果要取得线程名字的话,那么唯一能做的就是取得当前的线程名字。所以在Thread类里面提供有这样的方法:publicstaticThreadcurrentThread()。范例:线程的命名和取得packagecn.mldn.demo;classMyThreadimplementsRunnable{@Overridepublicvoidrun(){for(intx=0;x10;x++){System.out.println(Thread.currentThread().getName()+,x=+x);}}}publicclassTestDemo{publicstaticvoidmain(Stringargs[])throwsException{MyThreadmt=newMyThread();newThread(mt,线程A).start();newThread(mt).start();newThread(mt).start();}}如果在设置线程对象时没有设置具体的名字,那么就采用一个默认的名字进行定义。范例:观察以下代码packagecn.mldn.demo;classMyThreadimplementsRunnable{@Overridepublicvoidrun(){System.out.println(MyThread线程类:+Thread.currentThread().getName());}}publicclassTestDemo{publicstaticvoidmain(Stringargs[])throwsException{MyThreadmt=newMyThread();newThread(mt).start();//线程启动调用run()方法mt.run();//直接通过对象调用run()方法}}MyThread线程类:main(mt.run())MyThread线程类:Thread-0(newThread(mt).start())线程一定是依附于进程存在的,但是现在的进程在那里呢?第(3)页共(5)页每当使用java命令在JVM上解释某一个程序执行的时候,那么都会默认的启动一个JVM的进程,而主方法只是这进程中的一个线程,所以整个程序一直都跑在线程的运行机制上。每一个JVM至少会启动两个线程:主线程、GC线程。3.2、线程的休眠如果要想让某些线程延缓执行,那么就可以使用休眠的方式来进行处理,在Thread类里面提供有如下休眠操作:·休眠方法:publicstaticvoidsleep(longmillis)throwsInterruptedException;如果休眠的时间没到就停止休眠了,那么就会产生中断异常。范例:观察休眠packagecn.mldn.demo;classMyThreadimplementsRunnable{@Overridepublicvoidrun(){for(intx=0;x100;x++){try{Thread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}System.out.println(Thread.currentThread().getName()+,x=+x);}}}publicclassTestDemo{publicstaticvoidmain(Stringargs[])throwsException{MyThreadmt=newMyThread();newThread(mt,线程A).start();newThread(mt,线程B).start();newThread(mt,线程C).start();}}以上的代码执行中感觉像是所有的线程对象都同时休眠了。但是严格来讲不是同时,是有先后顺序的,只不过这个顺序小一点而已。packagecn.mldn.demo;classMyThreadimplementsRunnable{@Overridepublicvoidrun(){for(intx=0;x100;x++){try{Thread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}System.out.println(Thread.currentThread().getName()+,x=+x);第(4)页共(5)页}}}publicclassTestDemo{publicstaticvoidmain(Stringargs[])throwsException{MyThreadmt=newMyThread();Threadt=newThread(mt,线程A);t.start();Thread.sleep(2000);t.interrupt();//中断}}后续会使用休眠来进行线程的分析。3.3、线程的优先级从理论上来讲优先级越高的线程越有可能先执行。而在Thread类里面定义有以下的优先级的操作方法:·设置优先级:publicfinalvoidsetPriority(intnewPriority);·取得优先级:publicfinalintgetPriority()。而对于优先级一共定义有三种:·最高优先级:publicstaticfinalintMAX_PRIORITY,10;·中等优先级:publicstaticfinalintNORM_PRIORITY,5;·最低优先级:publicstaticfinalintMIN_PRIORITY,1。范例:观察优先级packagecn.mldn.demo;classMyThreadimplementsRunnable{@Overridepublicvoidrun(){for(intx=0;x100;x++){try{Thread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}System.out.println(Thread.currentThread().getName()+,x=+x);}}}publicclassTestDemo{publicstaticvoidmain(Stringargs[])throwsException{MyThreadmt=newMyThread();Threadt1=newThread(mt,线程A);Threadt2=newThread(mt,线程B);Threadt3=newThread(mt,线程C);t1.setPriority(Thread.MAX_PRIORITY);第(5)页共(5)页t2.setPriority(Thread.MIN_PRIORITY);t3.setPriority(Thread.MIN_PRIORITY);t1.start();t2.start();t3.start();}}范例:主线程的优先级是什么呢?publicclassTestDemo{publicstaticvoidmain(Stringargs[])throwsException{System.out.println(Thread.currentThread().getPriority());}}可以发现主线程属于一般优先级。4、总结1、线程要有名字,Thread.currentThread取得当前线程;2、线程的休眠是有先后顺序的;3、理论上线程的优先级越高越有可能先执行。
本文标题:2016032803_多线程的常用操作方法
链接地址:https://www.777doc.com/doc-2962945 .html