您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > Java语言程序设计第8章-46页PPT资料
1本讲内容线程基础–线程的概念–Thread类–Runnable接口–资源共享和线程同步–线程间的通信线程的生命周期线程的优先级程序举例2线程的概念进程:程序的一次执行线程:一个进程中的多个控制流通过多线程,一个进程表面上看同时可以执行一个以上的任务——并发多数程序设计语言不支持并发,支持多线程要借助于操作系统“原语(primitives)”Java是第一个支持内置线程操作的主流编程语言线程基础3Thread类简介线程类需要继承Thread类Thread的构造函数publicThread(StringthreadName)publicThread()在线程的run方法中编写线程的主要任务sleep方法使线程休眠interrupt方法中断一个运行中的线程isAlive方法检查线程的状态setName方法设置线程名join方法等待线程结束,以执行当前线程线程基础4例8_1在新线程中计算整数的阶乘publicclassEx8_1{publicstaticvoidmain(String[]args){System.out.println(mainthreadstarts);FactorialThreadthread=newFactorialThread(10);thread.start();System.out.println(newthreadstarted,mainthreadends);}//endmain}线程基础//classFactorialThreadcontrolsthreadexecutionclassFactorialThreadextendsThread{privateintnum;publicFactorialThread(intnum){this.num=num;}publicvoidrun(){inti=num;intresult=1;while(i0){result=result*i;i=i-1;}System.out.println(Thefactorialof+num+is+result);System.out.println(newthreadends);}}运行结果如下:mainthreadstartsnewthreadstarted,mainthreadendsThefactorialof10is3628800newthreadends7例8_2创建3个新线程,每个线程睡眠任意0-6秒钟,然后结束。publicclassEx8_2{publicstaticvoidmain(String[]args){//创建并命名每个线程TestThreadthread1=newTestThread(thread1);TestThreadthread2=newTestThread(thread2);TestThreadthread3=newTestThread(thread3);System.out.println(Startingthreads);thread1.start();//启动线程1thread2.start();//启动线程2thread3.start();//启动线程3System.out.println(Threadsstarted,mainends\n);}}线程基础classTestThreadextendsThread{privateintsleepTime;publicTestThread(Stringname)//构造函数{super(name);//调用基类构造函数为线程命名//获得随机休息毫秒数sleepTime=(int)(Math.random()*6000);}publicvoidrun()//线程启动并开始运行后要执行的方法{try{System.out.println(getName()+goingtosleepfor+sleepTime);Thread.sleep(sleepTime);//线程休眠}catch(InterruptedExceptionexception){};//运行结束,给出提示信息System.out.println(getName()+finished);}}运行结果为:StartingthreadsThreadsstarted,mainendsthread1goingtosleepfor3519thread2goingtosleepfor1689thread3goingtosleepfor5565thread2finishedthread1finishedthread3finished10Runnable接口如果希望一个已经有基类的类支持多线程,则不能再继承Thread类了(Java不支持多继承)解决方法:–使类实现Runnable接口,再与Thread类结合–使用一个内部类提供Runnable的实现代码,将内部类的对象与Thread结合相对于Thread类,它更适合于多个线程处理同一资源线程基础11例8_3使用Runnable接口实现例8_1功能publicclassEx8_1{publicstaticvoidmain(String[]args){System.out.println(mainthreadstarts);FactorialThreadt=newFactorialThread(10);newThread(t).start();System.out.println(newthreadstarted,mainthreadends);}//endmain}线程基础//classFactorialThreadcontrolsthreadexecutionclassFactorialThreadimplementsRunnable{privateintnum;publicFactorialThread(intnum){this.num=num;}publicvoidrun(){inti=num;intresult=1;while(i0){result=result*i;i=i-1;}System.out.println(Thefactorialof+num+is+result);System.out.println(newthreadends);}}13例8_4使用Runnable接口实现例8_2功能publicclassEx8_4{publicstaticvoidmain(String[]args){//创建3个实现Runnable接口类的对象TestThreadthread1=newTestThread();TestThreadthread2=newTestThread();TestThreadthread3=newTestThread();System.out.println(Startingthreads);//分别以三个对象为参数创建三个新线程,//第二个参数为新线程命名并启动之newThread(thread1,Thread1).start();newThread(thread2,Thread2).start();newThread(thread3,Thread3).start();System.out.println(Threadsstarted,mainends\n);}}线程基础classTestThreadimplementsRunnable{privateintsleepTime;publicTestThread()//构造方法{//获得随机休息毫秒数sleepTime=(int)(Math.random()*6000);}publicvoidrun()//线程启动并开始运行后要执行的方法{try{System.out.println(Thread.currentThread().getName()+goingtosleepfor+sleepTime);Thread.sleep(sleepTime);//线程休眠}catch(InterruptedExceptionexception){};//运行结束,给出提示信息System.out.println(Thread.currentThread().getName()+finished);}}运行结果如下:StartingthreadsThread1goingtosleepfor1487Thread2goingtosleepfor1133Threadsstarted,mainendsThread3goingtosleepfor2328Thread2finishedThread1finishedThread3finished16资源共享和线程同步独立的同时运行的线程有时需要共享一些数据并且考虑到彼此的状态和动作。–例如生产/消费问题:生产线程产生数据流,然后这些数据流再被消费线程消费。具体来说,假设一个Java应用程序,其中有一个线程负责往文件写数据,另一个线程从同一个文件中往出都数据,因为涉及到同一个资源,这里是同一个文件,这两个线程必须保证某种方式的同步。当多个线程的执行代码来自同一个类的实例(若干个)时,即称它们共享相同的代码,当共享访问相同的对象时,即它们共享相同的数据。–使用Runnable接口可以轻松实现多个线程共享相同数据,只要用同一个实现了Runnable接口的实例作为参数创建多个线程就可以了。线程基础17例8_5修改例8_4//只用一个Runnable类型的对象为参数创建3个新线程。publicclassEx8_5{publicstaticvoidmain(String[]args){//只创建1个实现Runnable接口类的对象TestThreadthread=newTestThread();System.out.println(Startingthreads);//只用一个Runnable类型对象为参数创建三个新线程,//命名并启动之newThread(thread,Thread1).start();newThread(thread,Thread2).start();newThread(thread,Thread3).start();System.out.println(Threadsstarted,mainends\n);}}线程基础classTestThreadimplementsRunnable{privateintsleepTime;publicTestThread()//构造函数{//获得随机休息毫秒数sleepTime=(int)(Math.random()*6000);}publicvoidrun()//线程启动并开始运行后要执行的方法{try{System.out.println(Thread.currentThread().getName()+goingtosleepfor+sleepTime);Thread.sleep(sleepTime);//线程休眠}catch(InterruptedExceptionexception){};//运行结束,给出提示信息System.out.println(Thread.currentThread().getName()+finished);}}StartingthreadsThread1goingtosleepfor966Thread2goingtosleepfor966Threadsstarted,mainendsThread3goingtosleepfor966Thread1finishedThread2finishedThread3finished20例8_6用三个线程模拟三个售票口,总共出售200张票。publicclassEx8_6{publicstaticvoidmain(String[]args){//新建一个售票类的对象SellTicketst=newSellTickets();//用此对象作为参数创建3个新
本文标题:Java语言程序设计第8章-46页PPT资料
链接地址:https://www.777doc.com/doc-6156951 .html