《java实验八多线程实验报告.docx》由会员分享,可在线阅读,更多相关《java实验八多线程实验报告.docx(18页珍藏版)》请在优知文库上搜索。
1、试验八多线程试验目标:(1)句运用Thread的子类创建线程:骂我实现RUnable接口来实现多线程:(2)驾驭税程之间的数据共享:(3)驾驭线程之间的同步方法;(4)与K线程之间的通信方法.试验任务I1.选择答胸(请将答案标成红色,如(AB):1 .下面关于线程的说法正确的是(ABD)0AMava支持多然程机制。B)一个线程创建并后动后,它招执行自己的11n()方法.假JO通过派生Thmad类实现多线程,则须要在子类中至新定义run。方法,把须要执行的代码写mn方法中;假如通过实现Runnable接口实现多线程,则要编号11n()方法的方法体。C)要在程序中实现多线程.需导入Thread类:
2、importjava.lang.Thread:D)一个程序中的主类不是Thrsd的子类,该类也没有实现RUnnabIe接口,则这个主类运行是不能限制主嫌程的休私2 .假如程序中创建了两个践程.一个的优先级是ThrEd.MAX_PRlORlTY.另一个的优先级是正常的默认优先级,下列陈述哪个是对的?(八)A)正常优先级的线程不运行,百副拥有最高优先级的线程停止运行。B)即信拥有最高优先级的线程结束运行,正常优先级的线程也不会运行。C)正常优先级的线程优先运行。D)上述说法都不对。3,下面哪个是RUnnable接口中的抽象方法(D)?AWart)stpOyieldD)run4 .编译下面的理序,得
3、到的结果是(C)。publicclassAimplementsRunnablc(publicvoidrun()SvsJcm.out.println(*OK.*);)publicstaticvoidmain(Stringllargs)I-hreadI-h=ncwIlircad(newA();Th.start();I)A)程序不能编译,产生异样。B)程序能维泽运行,但没有任何结果输出。C)程序能编译运行,输出结果:0K.D)上面说法都不对。5为什么处于激活状态的线程可能不足当前正在执行的线程?(BCD)(备注:激活(UnbkKk);假如堵塞线程的疗务发生,则该线程被激活并进入就绪队列.)A)因为已
4、经执行完run。方法。B)税程正在等待次盘输入。C)该线程调用了Wai方法。3该线程正在休嵌状态。5 .下面是个多线程的程序:PUbliCclassSimpleThreadextendsThreadpublicSiiiipleThrcad(Strinstr)(super(str):publicvoidrunOfor(inti=0:i10:i+)System.out.println(i*+getNaoeO);try(sleep(long)(Math,randomO*1000);)catch(InlcrruptedExceptione)1System,out.println(,DONH!”+get
5、Xame();publicclassTwoThreadsTest(publicstaticvoidaain(Stringargs)(newSiaPIeThradJamaica),startO:newSiBpleThreadCFiji*).startO:(I)输入该程序并运行之,体会多战程的程序的编写方法。输入该程序后执行结果截图如下:r三丁,Radoc启三日控制台次test(2)Javajgffi?EdevelopsJavajdkl.7.0-51binavaw.eeFijiJamaica1Fiji1 3maica2 Fiji3 3a11aica4 Fiji5 JdTdiCa6 Fiji7 Fi
6、ji4 Edis5 面die。6 Fiji7 Dairaica8 Damaica9 Fiji10 Fiji11 Damaica12 FijiDOME!Fiji13 DamaicaDONE13amaica(2)将该程序该为通过实现RUnMbIe接口的方式实现多线程。改为Runnable后程序代码如Hpackagezi;publicclassEx8_2_2publicstaticvoidmain(Strigargs)(Movemove-newMove();move.testl.start();move.test2.start();)classMoveimplementsRunnableThread
7、SStljeSt2;Move()(testl=newThread(this);testl.setName(Jamaica*);test2=newThread(this);test2.setName(Fiji);publicvoidrun()(if(Thread.currentThread()=testl)for(int(System.out.println(testl.getName();)elsefor(inti=lji=5;1+)(System.out.println(test2.getName();)运行结果截图如下:=X(Javadoc::aKEx8-2_2JavaE:develops
8、Javajdkl.7.0_51binjavaw.exe(JamaicaJdmdiCaDamaicaJamaiCaDamaicaFiji3omoicaFIjio11yicaFiji3,课本270页课后习题第4题.IPeftieSMServmmDataSourceExplorerv)SnippetsSConsole::CterminatedExe8.4JavaApplicationGdevdopsjavarebinjava.exe(201衅5月28日上午9H)kl7)AstartBstartAend8endCend下面给出一个范例(只供参考):(1)这个程序运行就是一个进程,依据要求要设计三个线程
9、,首先给出一个格助三个线程通信的类:/协助三个线程之间通信的类classSyncObject(2)接下来依据要求设计A战程和B跷程,因为两个线程功能相同,所以可以是同一个类的不同实例对象,设计该类如卜:线程Mcfi的交classWaitThreadextendsThreadfinalSyncObjectso;Stringname;WaitThread(SyncObjectso,Stringname)this.so-so;this.naine=name;)*Overridepublicvoidrun()ynchronized($o)/RfliSSSystem.out.println(name+,
10、start);try(so.wait();)catch(Exceptione)e.printStackTrace();)so.notifyAll();/三SttUI?System.out.printIn(name+end);)我们可以有到,花本设计方法与书本并无区分,同样为了协调三个我程之间通信,我们运用了个通信类,依据规范操作,斑个线程对通信类实例进行操作时,须要进行同步,就是获得锁旗标具体执行就是依据题意,调用WailO等待,留意WaiIo跟SIeePO是有区分的,前者会自动择放CPV和同步锁战标,而后者会修放CP1.但不会择放同步锁如标,在这里,出于三个线程都运用了同一个同步对象.因此.
11、须要运用WaitC(当然大家也可以不运用通伯对望来完成这个题目).(请大家具体看课本262页的解析)WaitO之后,就将自己至于就绪等待队列,然后so.notifAll();/唤留H他线程是噢醒其他战程,很明显在当前进程中,一共才三个税程,A和B进入了Wait状态,它们唤醒的就只有C了,于是C出场.(3)关于C的类设计结构范本跟上面A、B类一样,就是在run方法里面依据要求编写,苜先就是SIeeP一段时间,参数单位是亳秒,然后调用nnifya11让A和B接着运行R和B运行结束之后,自然会回到C运行,这时如何按起意来推阍其他线程都已结束呢?我们可以再一次,作用是C放弃当前CPY与银旗标,让其他线
12、程先运行完毕,这个时候假如C城程重新起先回到CPU执行,意味芾没有其他蚊程了,也就是可以推断AB己经执行完7.于是自己也开心的结束运行.关搂代码见下:try(SleeP(5000);/sleep后唤量其他线程,然后自己Waitso.notifyAll();so.wait();)catch(Eceptione)e.printStackTrace();)(4)泅试类一如既往马书本一样,如下:/测试类,执行A,B,C三个线程publicclassEXe8_4publicstaticvoidmain(Stringargs)SyncObjectso=newSyncbject();WaitThreadth
13、readl=newWaitThread(so,A);WaitThreadthread2=newWaitThread(so,B);NotifyThreadthread3=newNotifyThread(so,C);threadl.start();thread2.start();thread3.start();该题代码如下,packagezi;publicclassEX8_3ThreadA-newThread(A)(publicvoidrun()Wait(A););ThreadB=newThread(B)publicvoidrun()Wait(B);;ThreadC三newThread(C)pub
14、licvoidrun()while(true)if(!A.isAlive()&!B.isAlive()return;tryThread.sleep(2);catch(InterruptedExceptione)(e.printStackTrace();notifyall();;publicsynchronizedvoidWait(Stringname)System.out.pritln(name+start);try(Wait();catch(InterruptedExceptione)ePrintStackTraceO;System.out.printIn(name+end);)publicsynchronizedvoidnotifyall()notifyAll();publicstaticvoidmain(Stringargs)Ex8_3testnewEx8_3();A、B两税程起输入Start和命Hiend,不过中间有C让浅程休眠2秒,没法全都次性输出,之后再唤阴.让AB接#输出下半部分endtest.A.start();test.B