Java語言程序設(shè)計8_第1頁
Java語言程序設(shè)計8_第2頁
Java語言程序設(shè)計8_第3頁
Java語言程序設(shè)計8_第4頁
Java語言程序設(shè)計8_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

Java語言程序設(shè)計(鄭莉)第八章課后習(xí)題答案1.進(jìn)程和線程有何區(qū)別,Java是如何實(shí)現(xiàn)多線程的。

答:區(qū)別:一個程序至少有一個進(jìn)程,一個進(jìn)程至少有一個線程;線程的劃分尺度小于進(jìn)程;進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元,而多個線程共享內(nèi)存,從而極大地提高了程序的運(yùn)行效率。

Java程序一般是繼承Thread類或者實(shí)現(xiàn)Runnable接口,從而實(shí)現(xiàn)多線程。2.簡述線程的生命周期,重點(diǎn)注意線程阻塞的幾種情況,以及如何重回就緒狀態(tài)。

答:線程的聲明周期:新建-就緒-(阻塞)-運(yùn)行--死亡

線程阻塞的情況:休眠、進(jìn)入對象wait池等待、進(jìn)入對象lock池等待;

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

//Runnable接口實(shí)現(xiàn)的線程runable類publicclassrunnableimplementsRunnable{

privateStringcity;

publicrunnable(){}

publicrunnable(Stringcity){

this.city=city;

}

publicvoidrun(){

for(inti=0;i<10;i++){

System.out.println(city);

try{

//休眠1000毫秒。

Thread.sleep(1000);

}catch(InterruptedExceptione){

e.printStackTrace();

}

}

}

}

//Thread類實(shí)現(xiàn)的線程thread類publicclassrunnableextendsThread{

privateStringcity;

publicrunnable(){}

publicrunnable(Stringcity){

this.city=city;

}

publicvoidrun(){

for(inti=0;i<10;i++){

System.out.println(city);

try{

//休眠1000毫秒。

Thread.sleep(1000);

}catch(InterruptedExceptione){

e.printStackTrace();

}

}

}

}

//test8_3

publicclasstest8_3{

publicstaticvoidmain(String[]args){

//將創(chuàng)建一個線程對象,這個對象接受一個實(shí)現(xiàn)了Runnable接口。實(shí)際上這里也就是使用run()方法

runnabler1=newrunnable("廣州");

runnabler2=newrunnable("烏魯木齊");

Threadt1=newThread(r1);

Threadt2=newThread(r2);

//啟動線程

t1.start();

t2.start();

}}

運(yùn)行結(jié)果分別為:

4.編寫一個多線程程序?qū)崿F(xiàn)如下功能:線程A和線程B分別在屏幕上顯示信息“…start”后,調(diào)用wait等待;線程C開始后調(diào)用sleep休眠一段時間,然后調(diào)用notifyall,使線程A和線程B繼續(xù)運(yùn)行。線程A和線程B恢復(fù)運(yùn)行后輸出信息“…end”后結(jié)束,線程C在判斷線程B和線程A結(jié)束后自己結(jié)束運(yùn)行。//test8_4

publicclasstest8_4{

ThreadA=newThread("A"){

publicvoidrun(){

Wait("A");

}

};

ThreadB=newThread("B"){

publicvoidrun(){

Wait("B");

}

};

ThreadC=newThread("C"){

publicvoidrun(){

while(true){

if(!A.isAlive()&&!B.isAlive())

return;

try{

Thread.sleep(2000);

}catch(InterruptedExceptione){

e.printStackTrace();

}

notifyall();

}

}

};

publicsynchronizedvoidWait(Stringname){

System.out.println(name+"..start");

try{

wait();

}catch(InterruptedExceptione){

e.printStackTrace();

}

System.out.println(name+"..end");

}

publicsynchronizedvoidnotifyall(){

notifyAll();

}

publicstaticvoidmain(Stringargs[]){

test8_4test=newtest8_4();

//A、B兩線程一起輸入start和輸出end,不過中間有C讓線程休眠2秒,沒法全部一次性輸出,

//之后再喚醒,讓AB繼續(xù)輸出下半部分end

test.A.start();

test.B.start();

test.C.start();

}

}運(yùn)行結(jié)果:

5.實(shí)現(xiàn)一個數(shù)據(jù)單元,包括學(xué)號和姓名兩部分。編寫兩個線程,一個線程往數(shù)據(jù)單元中寫,另一個線程往外讀。要求沒寫一次就往外讀一次。

//Data類importjava.util.Scanner;

publicclassData{

StringstudentId;

Stringname;

booleanavailable=false;//判斷是讀是寫

Scannerin=newScanner(System.in);//定義一個輸入對象

publicsynchronizedvoidread()

{

if(available)

try

{

wait();

}

catch(Exceptione)

{

}

System.out.printf("請輸入學(xué)號:");

try

{

studentId=in.next();

}

catch(Exceptione)

{

System.out.println("輸入學(xué)號出錯!");

}

System.out.printf("請輸入姓名:");

try

{

name=in.next();

}

catch(Exceptione)

{

System.out.println("輸入姓名出錯!");

}

System.out.println();

available=true;

notify();

}

publicsynchronizedvoidwrite()

{

if(!available)

try

{

wait();

}

catch(Exceptione)

{

}

System.out.println("輸出學(xué)生學(xué)號:"+studentId+"姓名:"+name+"\n");

available=false;

notify();

}}//Read類publicclassReadextendsThread{

Datad1=null;

publicRead(Datad){

this.d1=d;

}

publicvoidrun(){

while(true)

{

d1.read();

}

}

}//Write類classWriteextendsThread{

Datad2=null;

publicWrite(Datad)

{

this.d2=d;

}

publicvoidrun()

{

while(true)

{

d2.write();

}

}

}

//test8_5類

publicclasstest8_5{

publicstaticvoidmain(String[]args){

Datadata=newData();

newRead(data).start();

newWrite(data).start();

}}運(yùn)行結(jié)果:

6.創(chuàng)建兩個不同優(yōu)先級的線程,都從1數(shù)到10000,看看哪個數(shù)得快。(注:線程的優(yōu)先級別越高低與執(zhí)行速度沒有絕對關(guān)系!)

//Count類

publicclassCountextendsThread{

intwhich;

intn=10000;

publicCount(intwhich){

this.which=which;

}

publicvoidrun(){

for(inti=1;i<=n;i++){

if(i==n){

System.out.println(which+"號進(jìn)程"+"結(jié)束!");

}

}

}

}//test8_6

publicclasstest8_6{

publicstaticvoidmain(String[]args){

Countcount1=newCount(1);

Countcount2=newCount(2);

Threadt1=newThread(count1);

Threadt2=newThread(count2);

t1.setPriority(2);//1號進(jìn)程優(yōu)先級是2

t2.setPriority(8);//2號進(jìn)程優(yōu)先級是8

t1.start();

t2.start();

}

}

運(yùn)行結(jié)果:

都有可能。

7.編寫一個Java程序,以說明較高優(yōu)先級的線程通過調(diào)用sleep方法,使較低優(yōu)先級的線程獲得運(yùn)行的機(jī)會。

(這里可以借鑒課本例8—13)

//TestThread類

publicclassTestThreadextendsThread{

privateinttick=1;

privateintnum;

publicTestThread(inti){

this.num=i;

}

publicvoidrun(){

while(tick<400000){

tick++;

if((tick%50000)==0){

System.out.println("Thread#"+num+",tick="+tick);

yield();

try{

sleep(1);

}catch(Exceptione){

}

}

}

}}//test8_7publicclasstest8_7{

publicstaticvoidmain(String[]args){

TestThread[]runners=newTestThread[2];

for(inti=0;i<2;i++){

runners[i]=newTestThread(i);

}

runners[0].setPriority(2);

runners[1].setPriority(5);

for(inti=0;i<2;i++){

runners[i].start();

}

}}運(yùn)行結(jié)果:

8.主線程控制新線程的生命,當(dāng)主線程運(yùn)行一段時間后,控制新線程死亡,主線程繼續(xù)運(yùn)行一段時間后結(jié)束。

(注:main函數(shù)就是主線程,程序里其他的Thread都屬于子線程。可以參考課本的例8—1)

//SonThread類

publicclassSonThreadextendsThread{

privateintnum;

publicSonThread(intnum){

this.num=num;

}

publicvoidrun(){

inti=num;

intresult=1;

System.out.println("newthreadstart.");

/*

while(i>0){

result=result*i;

i--;

}*/

System.out.println("thenewthreadof"+num+"is"+result);

System.out.println("newthreadends");

}

}//test8_8publicclasstest8_8{

publicstaticvoidmain(String[]args){

System.out.println("maintreadstart.");

SonThreadnewThread=newSonThread(10);

newThread.start();

//;浪費(fèi)時間的循環(huán)

inti=1;

while(i<=100000){

i++;

}

newThread.stop();//結(jié)束新進(jìn)程

System.out.println("mainthreadends");

}}

運(yùn)行結(jié)果:(這個結(jié)果很難把握,通常都會出現(xiàn)2那樣的結(jié)果,知道原理就好。)2

9.用兩個線程模擬存、取貨物。一個線程往一對象里放貨物(包括品名、價格),另外一個線程取貨物。分別模擬“放一個、取一個”和“放若干個、取若干個”兩種情況。

//Good貨物類

publicclassGood{

Stringname;

intprice;

publicGood(){

}

publicGood(Stringname,intprice){

=name;

this.price=price;

}

publicGood(Goodg){

=;

this.price=g.price;

}

}//WareHouse倉庫類

importjava.util.ArrayList;

importjava.util.List;

importjava.util.Scanner;publicclassWareHouse{

Goodgood=null;

Scannerin=newScanner(System.in);

Listlist=newArrayList();//用來存放商品對象

intcount;//想存入商品的個數(shù)

booleanavailable=true;

publicWareHouse(){

}

publicWareHouse(intcount){

this.count=count;

}

publicWareHouse(Listlist){

this.count=count;

for(inti=0;i<list.size();i++){

this.list.add((Good)list.get(i));

}

}

publicsynchronizedvoidsaveGood(){

if(available==false){

try{

wait();

}catch(InterruptedExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

}

for(inti=0;i<count;i++){

Stringn;

intp;

System.out.println("請輸入"+(i+1)+"號商品的名稱:");

n=in.next();

System.out.println("價格:");

p=in.nextInt();

good=newGood(n,p);

list.add(good);

}

available=false;

notify();

}

publicsynchronizedvoidtakeGood(){

if(available==true){

try{

wait();

}catch(InterruptedExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

}

for(inti=0;i<list.size();i++){

good=(Good)list.get(i);

System.out.print((i+1)+"號商品的名稱為:"+);

System.out.println("\t價格為:"+good.price);

}

available=true;

notify();

}}

//Save存貨物類

publicclassSaveextendsThread{

WareHousewareHouse=null;

publicSave(WareHousew){

this.wareHouse=w;

}

publicvoidrun(){

wareHouse.saveGood();

}

}

//Take取貨物類

publicclassTakeextendsThread{

WareHousewareHouse=null;

publicTake(WareHousew){

this.wareHouse=w;

}

publicvoidrun(){

wareHouse.takeGood();

}

}

//test8_9測試類

importjava.util.Scanner;

publicclasstest8_9{

publicstaticvoidmain(String[]args){

Scannerin=newScanner(System.in);

System.out.println("請輸入倉庫的容量:");

inti=in.nextInt();

WareHousewareHouse=newWareHouse(i);

ThreadsaveGood=newSave(wareHouse);

ThreadtakeGood=newTake(wareHouse);

saveGood.start();

takeGood.start();

}}運(yùn)行結(jié)果:

10.用兩個線程模擬對話,任何一個線程都可以隨時收發(fā)信息。(這道題本人搞不清楚,暫且用網(wǎng)上的給大家參考下。

聽說要用到:

Socket.getInputStream()獲取輸入流用于“接收”

Socket.getOutputStream()獲取輸出流用于“發(fā)送”

)//test8_10importjava.io.*;

import.*;

importjava.util.*;publicclasstest8_10{

publicstaticvoidmain(String[]args){

try{

//establishserversocket

ServerSockets=newServerSocket(8189);

//waitforclientconnection

Socketincoming=s.accept();

try{

InputStreaminStream=incoming.getInputStream();

OutputStreamoutStream=incoming.getOutputStream();

Scannerin=newScanner(inStream);

PrintWriterout=newPrintWriter(outStream,true);

out.println("Hello!EnterBYEtoexit.");

//echoclientinput

booleandone=false;

while(!done&&in.hasNextLine()){

Stringline=in.nextLine();

out.println("Echo:"+line);

if(line.trim().equals("BYE"))

done=true;

}

}finally{

incoming.close();

}

}catch(IOExceptione){

e.printStackTrace();

}

}

}個人中心我的主頁好友消息lx1713221968|裝扮|設(shè)置|退出\o"271607912的空間/博覽眾長"hitler現(xiàn)在我們所關(guān)心在意的事,在以后看來是否會變得愚蠢可笑呢?主頁博客相冊個人檔案好友i貼吧

查看文章

Java語言程序設(shè)計(鄭莉)第七章課后習(xí)題答案(b)2011-06-1223:256.聲明一個類,此類使用私有的ArrayList來存儲對象。使用一個Class類的引用得到第一個對象的類型之后,只允許用戶插入這種類型的對象。//Fuck類

importjava.util.ArrayList;publicclassFuck{

privateArrayListman=newArrayList();

privateClassclassType=null;

publicvoidadd(Objectf){

if(man.size()==0){

classType=f.getClass();

}

if(classType.equals(f.getClass())){

man.add(f);

System.out.println("插入成功.");

}

else{

System.out.println("只允許插入"+getClassType()+"類的對象.");

}

}

publicArrayListgetMan(){

returnman;

}

publicClassgetClassType(){

returnclassType;

}

publicFuck(){}

}//test7_6

publicclasstest7_6{

publicstaticvoidmain(String[]args){

Fuckfuckman=newFuck();

Strings=newString("林楚金");

fuckman.add(s);

fuckman.add(10);//測試插入插入整數(shù)

fuckman.add('f');//測試插入插入字符

fuckman.add("希特勒");

System.out.println(fuckman.getMan());

}}

運(yùn)行結(jié)果:

7.找出一個二維數(shù)組的鞍點(diǎn),即該位置上的元素在所在行上最大,在所在列上最小。(也可能沒有鞍點(diǎn))

//test7_7importjava.util.Scanner;

publicclasstest7_7{

publicstaticvoidmain(String[]args){

introw,series,max;

booleanT=false;

Scannercin=newScanner(System.in);

System.out.println("請輸入數(shù)組的行數(shù)");

row=cin.nextInt();

System.out.println("請輸入數(shù)組的列數(shù)");

series=cin.nextInt();

int[][]Array=newint[row][series];

int[]R=newint[row];//記錄每行最大的數(shù)的列標(biāo)

int[]S=newint[series];//記錄每列最小的數(shù)的行標(biāo)

System.out.println("請輸入數(shù)組內(nèi)容");

for(inti=0;i<Array.length;i++)

for(intj=0;j<Array[i].length;j++)

{Array[i][j]=cin.nextInt();

if(j==series-1){

max=Array[i][0];

for(intz=1;z<series;z++)

if(Array[i][z]>max)

{

max=Array[i][z];

R[i]=z;

}

}

}

for(intj=0;j<Array[0].length;j++)

{

max=Array[0][j];

for(intz=1;z<row;z++)

if(Array[z][j]<max)

{

max=Array[z][j];

S[j]=z;

}

}

for(inti=0;i<Array.length;i++)

{

if(S[R[i]]==i)

{

System.out.println("鞍點(diǎn):"+"Array["+i+"]["+R[i]+

"]:"+Array[i][R[i]]+"\n");

T=true;

}

}

if(T==false)

System.out.println("沒有鞍點(diǎn)");

}}

運(yùn)行結(jié)果:

8.聲明一個矩陣類Matrix,其成員變量是一個二維數(shù)組,數(shù)組元素類型為int,設(shè)計下面的方法,并聲明測試類對這些方法進(jìn)行測試。(1)構(gòu)造方法。Matrix()

//構(gòu)造一個10×10個元素的矩陣,沒有數(shù)據(jù)Matrix(intn)

//構(gòu)造一個n×n個元素的矩陣,數(shù)據(jù)隨機(jī)產(chǎn)生

Matrix(intn,intm)

//構(gòu)造一個n×m個元素的矩陣,數(shù)據(jù)隨機(jī)產(chǎn)生

Matrix(inttable[][])

//以一個整型的二維數(shù)組構(gòu)造一個矩陣

(2)實(shí)例方法。publicvoidoutput()

//輸出Matrix類中數(shù)組的元素值publicMatrixtranspose

//求一個矩陣的轉(zhuǎn)置矩陣

PublicBooleanisTriangular//判斷一個矩陣是否為上三角矩陣

PublicBooleanisSymmetry()//判斷一個矩陣是否為對稱矩陣

Publicvoidadd(Matrixb)

//將矩陣b與接受著對象相加,結(jié)果放在接受著對象中用key-value對來填充一個HashMap,并按hashcode排列輸出。

編寫一個方法,在方法中使用Iterator類遍歷Collection,并輸出此集合類中每個對象的hashCode()值。用對象填充不同類型的Collection類對象,并將此方法應(yīng)用于每一種Collection類對象。//Matrix類

publicclassMatrix{

intarray[][];

Matrix(){//構(gòu)造一個10X10個元素的矩陣,沒有數(shù)據(jù)

array=newint[10][10];

}

Matrix(intn){////構(gòu)造一個n?án個元素的矩陣,數(shù)據(jù)隨機(jī)產(chǎn)生

array=newint[n][n];

for(inti=0;i<n;i++){

for(intj=0;j<n;j++){

array[i][j]=(int)(Math.random()*10);

}

}

}

Matrix(intn,intm){//構(gòu)造一個n*m個元素的矩陣,數(shù)據(jù)隨機(jī)產(chǎn)生

array=newint[n][m];

for(inti=0;i<n;i++){

for(intj=0;j<m;j++)

array[i][j]=(int)(Math.random()*10);

}

}

Matrix(inttable[][]){//以一個整型的二維數(shù)組構(gòu)造一個矩陣

array=table;

}

publicvoidoutput(){//輸出Matrix類中數(shù)組的元素值

for(inti=0;i<array.length;i++){

for(intj=0;j<array[0].length;j++)

System.out.print(array[i][j]+"");

System.out.println();

}

}

publicvoidtranspose(){//輸出一個矩陣的轉(zhuǎn)置矩陣

for(inti=0;i<array[0].length;i++){

溫馨提示

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

最新文檔

評論

0/150

提交評論