java第八章答案

上傳人:da****ge 文檔編號(hào):106310174 上傳時(shí)間:2022-06-13 格式:DOC 頁數(shù):16 大小:126.50KB
收藏 版權(quán)申訴 舉報(bào) 下載
java第八章答案_第1頁
第1頁 / 共16頁
java第八章答案_第2頁
第2頁 / 共16頁
java第八章答案_第3頁
第3頁 / 共16頁

下載文檔到電腦,查找使用更方便

10 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《java第八章答案》由會(huì)員分享,可在線閱讀,更多相關(guān)《java第八章答案(16頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。

1、1.進(jìn)程和線程有何區(qū)別,Java是如何實(shí)現(xiàn)多線程的。 答:區(qū)別:一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程;線程的劃分尺度小于進(jìn)程;進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線程共享內(nèi)存,從而極大地提高了程序的運(yùn)行效率。 Java程序一般是 繼承Thread 類 或者實(shí)現(xiàn) Runnable接口,從而實(shí)現(xiàn)多線程。 2.簡述線程的生命周期,重點(diǎn)注意線程阻塞的幾種情況,以及如何重回就緒狀態(tài)。 答:線程的聲明周期:新建-就緒-(阻塞)-運(yùn)行--死亡 線程阻塞的情況:休眠、進(jìn)入對(duì)象wait池等待、進(jìn)入對(duì)象lock池等待; 休眠時(shí)間到回到就緒狀態(tài);在wait池中獲得notify()進(jìn)入lo

2、ck池,然后獲得鎖棋標(biāo)進(jìn)入就緒狀態(tài)。 3.隨便選擇兩個(gè)城市作為預(yù)選旅游目標(biāo)。實(shí)現(xiàn)兩個(gè)獨(dú)立的線程分別顯示10次城市名,每次顯示后休眠一段隨機(jī)時(shí)間(1000毫秒以內(nèi)),哪個(gè)先顯示完畢,就決定去哪個(gè)城市。分別用Runnable接口和Thread類實(shí)現(xiàn)。 (注:兩個(gè)類,相同一個(gè)測試類) //Runnable接口實(shí)現(xiàn)的線程runable類 public class runnable implements Runnable { ?private String city; ?public runnable() {} ?public runnable(String city) { ? this

3、.city = city; ?} ?public void run() { ? for (int i = 0; i < 10; i++) {?? ?? System.out.println(city); ?? try { ??? //休眠1000毫秒。 ??? Thread.sleep(1000); ?? } catch (InterruptedException e) { ??? e.printStackTrace(); ?? } ? }? ?} ?} // Thread類實(shí)現(xiàn)的線程thread類 public class runnable extends

4、Thread { ?private String city; ?public runnable() {} ?public runnable(String city) { ? this.city = city; ?} ?public void run() { ? for (int i = 0; i < 10; i++) {?? ?? System.out.println(city); ?? try { ??? //休眠1000毫秒。 ??? Thread.sleep(1000); ?? } catch (InterruptedException e) { ??? e.

5、printStackTrace(); ?? } ? }? ?} ?} ? //test8_3 public class test8_3 { ?public static void main(String[] args) { ??// 將創(chuàng)建一個(gè)線程對(duì)象,這個(gè)對(duì)象接受一個(gè)實(shí)現(xiàn)了Runnable接口。實(shí)際上這里也就是使用run()方法 ??runnable r1=new runnable("廣州"); ??runnable r2=new runnable("烏魯木齊"); ??Thread t1 = new Thread(r1); ??Thread t2 = new T

6、hread(r2); ??// 啟動(dòng)線程 ??t1.start(); ??t2.start(); ?} } 運(yùn)行結(jié)果分別為: ??? 4.編寫一個(gè)多線程程序?qū)崿F(xiàn)如下功能:線程A和線程B分別在屏幕上顯示信息“…start”后,調(diào)用wait等待;線程C開始后調(diào)用sleep休眠一段時(shí)間,然后調(diào)用notifyall,使線程A和線程B繼續(xù)運(yùn)行。線程A和線程B恢復(fù)運(yùn)行后輸出信息“…end”后結(jié)束,線程C在判斷線程B和線程A結(jié)束后自己結(jié)束運(yùn)行。 //test8_4 public class test8_4 { ?Thread A = new Thread("A") {

7、 ??public void run() { ???Wait("A"); ??} ?}; ?Thread B = new Thread("B") { ??public void run() { ???Wait("B"); ??} ?}; ?Thread C = new Thread("C") { ??public void run() { ???while (true) { ????if (!A.isAlive() && !B.isAlive()) ?????return; ????try { ?????Thread.sleep(2000); ????} ca

8、tch (InterruptedException e) { ?????e.printStackTrace(); ????} ????notifyall(); ???} ??} ?}; ? ?public synchronized void Wait(String name) { ??System.out.println(name + "..start"); ??try { ???wait(); ??} catch (InterruptedException e) { ???e.printStackTrace(); ??} ??System.out.println

9、(name + "..end"); ?} ?public synchronized void notifyall() { ??notifyAll(); ?} ?public static void main(String args[]) { ??test8_4 test = new test8_4(); ??//A、B兩線程一起輸入start和輸出end,不過中間有C讓線程休眠2秒,沒法全部一次性輸出, ??//之后再喚醒,讓AB繼續(xù)輸出下半部分end ??test.A.start(); ??test.B.start(); ??test.C.start(); ?} }

10、 運(yùn)行結(jié)果: ? 4. lass test implements Runnable{ public test(){ } public void run(){ if(Thread.currentThread().getName().equals("A")){ System.out.println("A...start"); synchronized(this) { try{ wait(); System.out.println("A...end"); notify(); }catch(Exception e){

11、 } } } else if(Thread.currentThread().getName().equals("B")){ System.out.println("B...start"); synchronized(this){ try{ wait(); System.out.println("B...end"); }catch(Exception e){ } } }else if(Thread.currentThread().getName().equals("C")){ try{ Thread.sleep(10);

12、 synchronized(this){ notify(); } }catch(Exception e){ } } } } public class d { public static void main(String args[]) { test show=new test(); Thread A=new Thread(show,"A"); Thread B=new Thread(show,"B"); Thread C=new Thread(show,"C"); A.start(); B.start(); C.start()

13、; } } 5.實(shí)現(xiàn)一個(gè)數(shù)據(jù)單元,包括學(xué)號(hào)和姓名兩部分。編寫兩個(gè)線程,一個(gè)線程往數(shù)據(jù)單元中寫,另一個(gè)線程往外讀。要求沒寫一次就往外讀一次。 //Data類 import java.util.Scanner; public class Data{ ?String studentId; ?String name; ?boolean available = false;// 判斷是讀是寫 ?Scanner in = new Scanner(System.in);// 定義一個(gè)輸入對(duì)象 ?public synchronized void read() ?{ ?

14、?if(available) ???try ???{ ????wait(); ???} ???catch(Exception e) ???{ ???? ???} ??System.out.printf("請輸入學(xué)號(hào):"); ??try ??{ ???studentId=in.next(); ??} ??catch(Exception e) ??{ ???System.out.println("輸入學(xué)號(hào)出錯(cuò)!"); ??} ??System.out.printf("請輸入姓名:"); ??try ??{ ???name=in.next(); ??}

15、??catch(Exception e) ??{ ???System.out.println("輸入姓名出錯(cuò)!"); ??} ??System.out.println(); ??available=true; ??notify(); ?} ?public synchronized void write() ?{ ??if(!available) ???try ???{ ????wait(); ???} ???catch(Exception e) ???{??? ???} ??System.out.println("輸出學(xué)生學(xué)號(hào):"+studentId+" 姓

16、名:"+name+"\n"); ??available=false; ??notify(); ?} } //Read類 public class Read extends Thread{ ?Data d1 = null; ?public Read(Data d){ ??this.d1=d;? ?} ?public void run(){ ??while(true) ??{ ???d1.read(); ??} ?} } //Write類 class Write extends Thread{ ?Data d2=null; ?public Write(Da

17、ta d) ?{ ??this.d2=d; ?} ?public void run() ?{ ??while(true) ??{ ???d2.write(); ??} ?} } //test8_5類 public class test8_5 { ?public static void main(String[] args){ ??Data data=new Data(); ??new Read(data).start(); ??new Write(data).start(); ?? ?} } 運(yùn)行結(jié)果: ? 6.創(chuàng)建兩個(gè)不同優(yōu)先級(jí)的線程,都

18、從1數(shù)到10000,看看哪個(gè)數(shù)得快。 (注:線程的優(yōu)先級(jí)別越高低與執(zhí)行速度沒有絕對(duì)關(guān)系!) //Count類 public class Count extends Thread { ?int which; ?int n = 10000; ?public Count(int which){ ??this.which=which;? ?} ?public void run() { ??for (int i = 1; i <= n; i++) { ???if (i == n) { ????System.out.println(which+"號(hào)進(jìn)程"+ "結(jié)束!"); ???

19、} ??} ?} } //test8_6 public class test8_6 { ?public static void main(String[] args) { ??Count count1 = new Count(1); ??Count count2 = new Count(2);? ??Thread t1 = new Thread(count1); ??Thread t2 = new Thread(count2);?? ??t1.setPriority(2);//1號(hào)進(jìn)程優(yōu)先級(jí)是2 ??t2.setPriority(8);//2號(hào)進(jìn)程優(yōu)先級(jí)是8 ??t1

20、.start(); ??t2.start(); ?} } 運(yùn)行結(jié)果: 都有可能。 7.編寫一個(gè)Java程序,以說明較高優(yōu)先級(jí)的線程通過調(diào)用sleep方法,使較低優(yōu)先級(jí)的線程獲得運(yùn)行的機(jī)會(huì)。 (這里可以借鑒課本例8—13) //TestThread類 public class TestThread extends Thread { ?private int tick = 1; ?private int num; ?public TestThread(int i) { ??this.num = i; ?} ?public void run() { ??while

21、 (tick < 400000) { ???tick++; ???if ((tick % 50000) == 0) { ????System.out.println("Thread #" + num + ",tick =" + tick); ????yield(); ????try { ?????sleep(1); ????} catch (Exception e) { ????} ???} ??} ?} } //test8_7 public class test8_7 { ?public static void main(String[] args){ ??T

22、estThread[] runners = new TestThread[2]; ??for(int i=0;i<2;i++){ ???runners[i]=new TestThread(i); ??} ??runners[0].setPriority(2); ??runners[1].setPriority(5); ??for(int i=0;i<2;i++){ ???runners[i].start(); ??} ? ?} } 運(yùn)行結(jié)果: ? 8.主線程控制新線程的生命,當(dāng)主線程運(yùn)行一段時(shí)間后,控制新線程死亡,主線程繼續(xù)運(yùn)行一段時(shí)間后結(jié)束。 (注:main函數(shù)

23、就是主線程,程序里其他的Thread都屬于子線程。可以參考課本的例8—1) //SonThread類 public class SonThread extends Thread{ ?private int num; ?public SonThread(int num){ ??this.num=num; ?} ?public void run(){ ??int i=num; ??int result=1; ??System.out.println("new thread start."); ?/*?while(i>0){ ???result=result*i; ???i

24、--; ??}*/ ??System.out.println("the new thread of "+num+"is "+result); ??System.out.println("new thread ends"); ?} } //test8_8 public class test8_8 { ?public static void main(String[] args){ ??System.out.println("main tread start."); ??SonThread newThread = new SonThread(10); ??newThread.

25、start(); ??//;浪費(fèi)時(shí)間的循環(huán) ??int i=1; ??while(i<=100000){ ???i++; ??} ??newThread.stop();//結(jié)束新進(jìn)程 ??System.out.println("main thread ends"); ?? ?} } 運(yùn)行結(jié)果:(這個(gè)結(jié)果很難把握,通常都會(huì)出現(xiàn)2那樣的結(jié)果,知道原理就好。) 2 ? 9.用兩個(gè)線程模擬存、取貨物。一個(gè)線程往一對(duì)象里放貨物(包括品名、價(jià)格),另外一個(gè)線程取貨物。分別模擬“放一個(gè)、取一個(gè)”和“放若干個(gè)、取若干個(gè)”兩種情況。 //Good貨物類 public cla

26、ss Good { ?String name; ?int price; ?public Good(){ ?? ?} ?public Good(String name,int price){ ??this.name=name; ??this.price=price; ?} ?public Good(Good g){ ??this.name=g.name; ??this.price=g.price;? ?} } //WareHouse倉庫類 import java.util.ArrayList; import java.util.List; import jav

27、a.util.Scanner; public class WareHouse { ?Good good = null; ?Scanner in = new Scanner(System.in); ?List list = new ArrayList();//用來存放商品對(duì)象 ?int count;//想存入商品的個(gè)數(shù) ?boolean available = true; ?public WareHouse() { ?} ? ?public WareHouse(int count) { ??this.count = count; ?} ?public WareHouse

28、(List list) { ??this.count = count; ??for (int i = 0; i < list.size(); i++) { ???this.list.add((Good) list.get(i)); ??} ?} ?public synchronized void saveGood() { ??if (available==false) { ???try { ????wait(); ???} catch (InterruptedException e) { ????// TODO Auto-generated catch block ??

29、??e.printStackTrace(); ???} ??}?? ??for (int i = 0; i < count; i++) { ???String n; ???int p; ???System.out.println("請輸入" + (i+1) + "號(hào)商品的名稱:"); ???n = in.next(); ???System.out.println("價(jià)格:"); ???p = in.nextInt(); ???good = new Good(n, p); ???list.add(good); ??} ??available = false; ??no

30、tify();???? ?} ?public synchronized void takeGood() { ??if (available==true) { ???try { ????wait(); ???} catch (InterruptedException e) { ????// TODO Auto-generated catch block ????e.printStackTrace(); ???} ??} ??for (int i = 0; i < list.size(); i++) { ???good = (Good) list.get(i); ???S

31、ystem.out.print((i+1)+ "號(hào)商品的名稱為:" + good.name); ???System.out.println("\t價(jià)格為:" + good.price); ??} ??available = true; ??notify(); ?} } //Save存貨物類 public class Save extends Thread{ ?WareHouse wareHouse = null; ?public Save(WareHouse w){ ??this.wareHouse=w;? ?} ?public void run(){ ?? ??

32、?wareHouse.saveGood();?? ?} } //Take取貨物類 public class Take extends Thread{ ?WareHouse wareHouse = null; ?public Take(WareHouse w){ ??this.wareHouse=w;? ?} ?public void run(){?? ?? ???wareHouse.takeGood();?????? ?} } //test8_9測試類 import java.util.Scanner; public class test8_9 { ?publ

33、ic static void main(String[] args){?? ??Scanner in =new Scanner(System.in); ??System.out.println("請輸入倉庫的容量:"); ??int i=in.nextInt(); ??WareHouse wareHouse=new WareHouse(i); ??Thread saveGood=new Save(wareHouse); ??Thread takeGood=new Take(wareHouse); ? ??saveGood.start(); ??takeGood.start()

34、;????? ?} } 運(yùn)行結(jié)果:? 10.用兩個(gè)線程模擬對(duì)話,任何一個(gè)線程都可以隨時(shí)收發(fā)信息。 (這道題本人搞不清楚,暫且用網(wǎng)上的給大家參考下。 聽說要用到: Socket.getInputStream()獲取輸入流用于“接收” Socket.getOutputStream()獲取輸出流用于“發(fā)送” ) //test8_10 import java.io.*; import .*; import java.util.*; public class test8_10 { ??? public static void main(String[] args

35、) { ??????? try { ??????????? // establish server socket ??????????? ServerSocket s = new ServerSocket(8189); ??????????? // wait for client connection ??????????? Socket incoming = s.accept(); ??????????? try { ??????????????? InputStream inStream = incoming.getInputStream(); ??????????????

36、? OutputStream outStream = incoming.getOutputStream(); ??????????????? Scanner in = new Scanner(inStream); ??????????????? PrintWriter out = new PrintWriter(outStream, true); ??????????????? out.println("Hello! Enter BYE to exit."); ??????????????? // echo client input ??????????????? boolean d

37、one = false; ??????????????? while (!done && in.hasNextLine()) { ??????????????????? String line = in.nextLine(); ??????????????????? out.println("Echo: " + line); ??????????????????? if (line.trim().equals("BYE")) ??????????????????????? done = true; ??????????????? } ??????????? } finally { ??????????????? incoming.close(); ??????????? } ??????? } catch (IOException e) { ??????????? e.printStackTrace(); ??????? } ??? } }

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔

相關(guān)搜索

關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!