第七章 Java多线程机制

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1第七章Java多线程机制贺玉珍heyzh@ycu.edu.cn计算机科学与技术系2主要内容线程基础知识线程的创建和启动线程控制线程的优先级别线程同步计算机科学与技术系37.1线程基础知识程序:一段静态的代码。进程:程序的一次动态执行过程。线程:是指程序中的一条执行路径。多进程:在操作系统中可以同时运行多个任务(程序)多线程:在同一个应用程序中,同时存在几个执行体,按几条不同的执行路线共同工作。Java虚拟机允许应用程序并发地运行多个执行线程。计算机科学与技术系publicclassThreadExp{publicstaticvoidmain(Stringargs[]){m1();}publicstaticvoidm1(){m2();m3();}publicstaticvoidm2(){}publicstaticvoidm3(){}}47.1线程基础知识Java的线程是通过java.lang.Thread类来实现的。每个Java程序至少有一个线程(主线程),当一个Java程序程序启动时,JVM会创建主线程,并在该线程中调用程序的main()方法;可以通过创建Thread的实例来创建新的线程。每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程。计算机科学与技术系5计算机科学与技术系7.2线程的创建和启动有两种方式创建新的线程。第一种:声明实现Runnable接口的类①定义线程类,实现Runnable接口。②实例化Thread对象。③调用start()方法启动线程。例:ThreadmyThread=newThread(Runnabletarget);//target为Runnable接口类型对象myThread.start();6计算机科学与技术系7.2线程的创建和启动Runnable中只有一个方法:在实现Runnable接口的类的run方法定义中可以使用Thread的静态方法:比如:publicvoidrun()//用于定义线程运行体publicstaticThreadcurrentThread()//获取当前线程的引用7计算机科学与技术系7.2线程的创建和启动有两种方式创建新的线程。第一种:定义线程类实现Runnable接口。ThreadmyThread=newThread(target);//target为Runnable接口类型Runnable中只有一个方法:使用Runnable接口可以为多个线程提供共享的数据。在实现Runnable接口的类的run方法定义中可以使用Thread的静态方法:publicvoidrun()//用于定义线程运行体publicclassTestRunnable{publicstaticvoidmain(Stringargs[]){Runner1r=newRunner1();//r.run();Threadt=newThread(r);t.start();for(inti=0;i10;i++){System.out.println(MainThread:-------+i);}}}classRunner1implementsRunnable{publicvoidrun(){for(inti=0;i10;i++){System.out.println(Runner1:+i);}}}8计算机科学与技术系7.2线程的创建和启动第二种:将类声明为Thread的子类①定义一个Thread类的子类,并重写run()方法。如:②然后生成该类的实例对象。例:③调用start()方法启动线程。classMyThreadextendsThread{publicvoidrun(){…}}MyThreadmyThread=newMyThread();myThread.start();9计算机科学与技术系7.2线程的创建和启动第二种:将类声明为Thread的子类定义一个Thread类的子类,并重写run()方法。如:然后生成该类的实例对象。例:调用start()方法启动线程。classMyThreadextendsThread{publicvoidrun(){…}}MyThreadmyThread=newMyThread();myThread.start();publicclassTestThread{publicstaticvoidmain(Stringargs[]){MyThreadt=newMyThread();t.start();//Threadth=newThread(t);//th.start();for(inti=0;i10;i++){System.out.println(MainThread:-------+i);}}}classMyThreadextendsThread{publicvoidrun(){for(inti=0;i10;i++){System.out.println(Runner1:+i);}}}107.2线程的创建和启动Thread类的构造方法和常用方法:Thread();Thread(RunnableTarget);Thread(RunnableTarget,Stringname);Thread(Stringname);voidrun();voiddestroy();\\删除一个线程stringgetName();voidstart();11计算机科学与技术系7.3线程控制线程的状态转换Yield()stop()notify()resume()wait()join()sleep()suspend()12计算机科学与技术系7.3线程控制线程控制基本方法:booleanisAlive()intgetPriority()voidsetPriority(intnewPriority)staticvoidsleep(longmillis)throwsInterruptedExceptionvoidjoin()throwsInterruptedExceptionstaticvoidyield()voidwait()throwsInterruptedExceptionvoidnotify()voidnotifyAll()13计算机科学与技术系7.3线程控制sleep方法使得当前线程休眠(暂停执行millis毫秒)。由于是静态方法,sleep可以由类名直接调用:例:TestSleep.javapublicstaticvoidsleep(longmillis)throwsInterruptedExceptionThread.sleep(…);14计算机科学与技术系7.3线程控制线程控制基本方法:booleanisAlive()intgetPriority()voidsetPriority(intnewPriority)staticvoidsleep(longmillis)voidjoin()throwsInterruptedExceptionstaticvoidyield()voidwait()throwsInterruptedExceptionvoidnotify()voidnotifyAll()importjava.util.*;publicclassTestSleep{publicstaticvoidmain(Stringargs[]){MyThread1th=newMyThread1();th.start();try{Thread.sleep(10000);}catch(InterruptedExceptione){}th.interrupt();}}classMyThread1extendsThread{//booleanflag=true;publicvoidrun(){//能否在这使用throwsInterruptedExceptionwhile(true){//while(flag){System.out.println(=====+newDate()+=====);try{sleep(1000);}catch(InterruptedExceptione){return;}}}}15计算机科学与技术系7.3线程控制join方法等待该线程结束。例:TestJoin.javapublicfinalvoidjoin()throwsInterruptedException当某一个线程要等待另一个线程时,它自己会进入等待状态,直到它等待的事情完成了,它才又会回到就绪状态,准备被CPU挑选执行。16计算机科学与技术系7.3线程控制join方法等待该线程结束。例:TestJoin.javapublicfinalvoidjoin()throwsInterruptedExceptionpublicclassTestJoin{publicstaticvoidmain(Stringargs[]){MyThread2thread1=newMyThread2(thread1);thread1.start();try{thread1.join();}catch(InterruptedExceptione){}for(inti=1;i=10;i++){System.out.println(Iammainthread.);}}}classMyThread2extendsThread{MyThread2(Strings){super(s);}publicvoidrun(){for(inti=1;i=10;i++){System.out.println(Iam+getName());try{sleep(1000);}catch(InterruptedExceptione){return;}}}}17计算机科学与技术系7.3线程控制yield方法暂停当前正在执行的线程对象(使其从执行状态转换到就绪状态),并执行其他线程。例:TestYield.javapublicstaticvoidyield()18计算机科学与技术系7.3线程控制yield方法暂停当前正在执行的线程对象,并执行其他线程。例:TestYield.javapublicstaticvoidyield()publicclassTestYield{publicstaticvoidmain(Stringargs[]){MyThread3t1=newMyThread3(t1);MyThread3thread2=newMyThread3(thread2);t1.start();thread2.start();}}classMyThread3extendsThread{MyThread3(Strings){super(s);}publicvoidrun(){for(inti=1;i=100;i++){System.out.println(getName()+:+i);if(i%10==0){Thread.yield();}}}}19计算机科学与技术系7.4线程的优先级别Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程。线程调度器按照线程的优先级决定应调度哪个线程来执行。线程的优先级用数字表示,范围从1到10,一个线程的缺省优先级是5。使用下述方法获得或设置线程对象优先级:Thread.MIN_PRIORITY=1Thread.MAX_PRIORITY=10Thread.NORM_PRIORITY=5intgetPriority()voidsetPriority(intnewPriority)20计算机科学与技术系7.4线程的优先级别Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程。线程调度器按照线程的优先级决定应调度哪个线程来执行。线程的

1 / 33
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功