




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度草原雇傭放羊與生態(tài)旅游合作合同
- 南充經(jīng)濟(jì)開發(fā)區(qū)投資集團(tuán)有限公司2024年招聘筆試參考題庫附帶答案詳解
- 交通法學(xué)概論(山東聯(lián)盟)知到智慧樹章節(jié)測試課后答案2024年秋山東交通學(xué)院
- 2025年安慶市大觀控股集團(tuán)有限公司校園招聘3人筆試參考題庫附帶答案詳解
- 2025年中儲糧集團(tuán)紀(jì)檢監(jiān)察組招聘(4人)筆試參考題庫附帶答案詳解
- 邊牧撫養(yǎng)知識培訓(xùn)課件
- 2025中聯(lián)重科開封工業(yè)園招聘280人筆試參考題庫附帶答案詳解
- 寵物行業(yè)知識培訓(xùn)課件
- 中醫(yī)面部知識培訓(xùn)課件下載
- 2025年上半年佛山市順德區(qū)大良街道招考工作人員易考易錯模擬試題(共500題)試卷后附參考答案
- 員工安全風(fēng)險辨識及管控措施
- 水利水電工程施工質(zhì)量管理及驗收規(guī)程講課稿課件
- 介入科規(guī)章制度
- 《大氣污染物控制工程》-揮發(fā)性有機(jī)物污染控制
- 《連續(xù)性腎替代治療容量評估與管理專家共識》解讀課件
- 健康產(chǎn)業(yè)數(shù)字化服務(wù)平臺建設(shè)及運(yùn)營模式
- 現(xiàn)代家政導(dǎo)論-課件 5.2.1認(rèn)識國外家政服務(wù)業(yè)發(fā)展
- 2024湖北事業(yè)單位聯(lián)考C類真題解析歷年高頻難、易錯點(diǎn)500題模擬試題附帶答案詳解
- GB/T 44723-2024氫燃料內(nèi)燃機(jī)通用技術(shù)條件
- 駕駛員職業(yè)健康知識培訓(xùn)
- 【課件】程式與意蘊(yùn)-中國傳統(tǒng)繪畫+課件高中美術(shù)人美版(2019)美術(shù)鑒賞
評論
0/150
提交評論