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)throwsInterruptedExceptionvoidjoin()throwsInterruptedExceptionstaticvoidyield()voidwait()throwsInterruptedExceptionvoidnotify()voidnotifyAll()13计算机科学与技术系7.3线程控制sleep方法使得当前线程休眠(暂停执行millis毫秒)。由于是静态方法,sleep可以由类名直接调用:例:TestSleep.javapublicstaticvoidsleep(longmillis)throwsInterruptedExceptionThread.sleep(…);14计算机科学与技术系7.3线程控制线程控制基本方法:booleanisAlive()intgetPriority()voidsetPriority(intnewPriority)staticvoidsleep(longmillis)voidjoin()throwsInterruptedExceptionstaticvoidyield()voidwait()throwsInterruptedExceptionvoidnotify()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提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程。线程调度器按照线程的优先级决定应调度哪个线程来执行。线程的