java第八章答案
《java第八章答案》由會員分享,可在線閱讀,更多相關《java第八章答案(16頁珍藏版)》請在裝配圖網上搜索。
1、1.進程和線程有何區(qū)別,Java是如何實現(xiàn)多線程的。 答:區(qū)別:一個程序至少有一個進程,一個進程至少有一個線程;線程的劃分尺度小于進程;進程在執(zhí)行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。 Java程序一般是 繼承Thread 類 或者實現(xiàn) Runnable接口,從而實現(xiàn)多線程。 2.簡述線程的生命周期,重點注意線程阻塞的幾種情況,以及如何重回就緒狀態(tài)。 答:線程的聲明周期:新建-就緒-(阻塞)-運行--死亡 線程阻塞的情況:休眠、進入對象wait池等待、進入對象lock池等待; 休眠時間到回到就緒狀態(tài);在wait池中獲得notify()進入lo
2、ck池,然后獲得鎖棋標進入就緒狀態(tài)。 3.隨便選擇兩個城市作為預選旅游目標。實現(xiàn)兩個獨立的線程分別顯示10次城市名,每次顯示后休眠一段隨機時間(1000毫秒以內),哪個先顯示完畢,就決定去哪個城市。分別用Runnable接口和Thread類實現(xiàn)。 (注:兩個類,相同一個測試類) //Runnable接口實現(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類實現(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)建一個線程對象,這個對象接受一個實現(xiàn)了Runnable接口。實際上這里也就是使用run()方法 ??runnable r1=new runnable("廣州"); ??runnable r2=new runnable("烏魯木齊"); ??Thread t1 = new Thread(r1); ??Thread t2 = new T
6、hread(r2); ??// 啟動線程 ??t1.start(); ??t2.start(); ?} } 運行結果分別為: ??? 4.編寫一個多線程程序實現(xiàn)如下功能:線程A和線程B分別在屏幕上顯示信息“…start”后,調用wait等待;線程C開始后調用sleep休眠一段時間,然后調用notifyall,使線程A和線程B繼續(xù)運行。線程A和線程B恢復運行后輸出信息“…end”后結束,線程C在判斷線程B和線程A結束后自己結束運行。 //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、 運行結果: ? 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.實現(xiàn)一個數(shù)據(jù)單元,包括學號和姓名兩部分。編寫兩個線程,一個線程往數(shù)據(jù)單元中寫,另一個線程往外讀。要求沒寫一次就往外讀一次。 //Data類 import java.util.Scanner; public class Data{ ?String studentId; ?String name; ?boolean available = false;// 判斷是讀是寫 ?Scanner in = new Scanner(System.in);// 定義一個輸入對象 ?public synchronized void read() ?{ ?
14、?if(available) ???try ???{ ????wait(); ???} ???catch(Exception e) ???{ ???? ???} ??System.out.printf("請輸入學號:"); ??try ??{ ???studentId=in.next(); ??} ??catch(Exception e) ??{ ???System.out.println("輸入學號出錯!"); ??} ??System.out.printf("請輸入姓名:"); ??try ??{ ???name=in.next(); ??}
15、??catch(Exception e) ??{ ???System.out.println("輸入姓名出錯!"); ??} ??System.out.println(); ??available=true; ??notify(); ?} ?public synchronized void write() ?{ ??if(!available) ???try ???{ ????wait(); ???} ???catch(Exception e) ???{??? ???} ??System.out.println("輸出學生學號:"+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(); ?? ?} } 運行結果: ? 6.創(chuàng)建兩個不同優(yōu)先級的線程,都
18、從1數(shù)到10000,看看哪個數(shù)得快。 (注:線程的優(yōu)先級別越高低與執(zhí)行速度沒有絕對關系!) //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+"號進程"+ "結束!"); ???
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號進程優(yōu)先級是2 ??t2.setPriority(8);//2號進程優(yōu)先級是8 ??t1
20、.start(); ??t2.start(); ?} } 運行結果: 都有可能。 7.編寫一個Java程序,以說明較高優(yōu)先級的線程通過調用sleep方法,使較低優(yōu)先級的線程獲得運行的機會。 (這里可以借鑒課本例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(); ??} ? ?} } 運行結果: ? 8.主線程控制新線程的生命,當主線程運行一段時間后,控制新線程死亡,主線程繼續(xù)運行一段時間后結束。 (注: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(); ??//;浪費時間的循環(huán) ??int i=1; ??while(i<=100000){ ???i++; ??} ??newThread.stop();//結束新進程 ??System.out.println("main thread ends"); ?? ?} } 運行結果:(這個結果很難把握,通常都會出現(xiàn)2那樣的結果,知道原理就好。) 2 ? 9.用兩個線程模擬存、取貨物。一個線程往一對象里放貨物(包括品名、價格),另外一個線程取貨物。分別模擬“放一個、取一個”和“放若干個、取若干個”兩種情況。 //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();//用來存放商品對象 ?int count;//想存入商品的個數(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) + "號商品的名稱:"); ???n = in.next(); ???System.out.println("價格:"); ???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)+ "號商品的名稱為:" + good.name); ???System.out.println("\t價格為:" + 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、;????? ?} } 運行結果:? 10.用兩個線程模擬對話,任何一個線程都可以隨時收發(fā)信息。 (這道題本人搞不清楚,暫且用網上的給大家參考下。 聽說要用到: 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)系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
5. 裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【初中生物】人教版八年級生物上冊細菌、真菌和病毒復習課件
- 碩士研究生開題報告p16在宮頸癌發(fā)生中的作用及其機制的研究課件
- 六年級數(shù)學上冊《數(shù)學廣角—數(shù)與形》課件
- 華東師大版八年級上冊數(shù)學第12章--整合提升作業(yè)ppt課件含答案
- 《糧食來得真不容易》教學課件
- 熱力環(huán)流公開課教學課件高中地理
- 人工耳蝸的新進展課件
- 皮下注射低分子肝素鈣課件
- 腸梗阻圍手術期護理ppt課件
- 藥用動物學緒論01
- 國際營銷專業(yè)英語Unit 4 How to Do Market Research
- 3標點符號的使用方法(用)匯總
- 物質濫用病人之護理課件
- 名師PPT——特殊保護課件
- 大學生創(chuàng)新創(chuàng)業(yè)訓練計劃項目答辯課件