7.2.4 多執行緒的運用
上節中出現假死的原因就是因為 CPU 資源獨占的緣故。如果我們能夠將造成“假死”
的那段代碼采用多執行緒機制來進行,那么就可以讓服務器不停讀套接字埠的同時,原來的
程式照預定方式繼續運行。
對 7.2.3 的簡單聊天系統,我們希望服務器端能多次接收客戶端發送的資訊,直到接收
到“QUIT”資訊才終止連接。
我們就可以采用執行緒的機制來實作。
1 . 添加實作資訊接收功能的執行緒類
在 singleServer 工程的 ServerApp 類中,添加一個內部類,該內部類的作用是自定義線
程類,主要實作服務器端對客戶端資訊的多次接收功。其中,加黑部分的代碼是要實作任意
多次資訊接收的死回圈,我們將其放在執行緒的 run()方法中,通過多執行緒的運行機制,解決
了程式假死的現象,在 SWT 中,不能在執行緒中直接更新界面中組件,必須通過異步的方式更
新,其中 appendInformation(String str)方法的作用是采用異步方式更新界面。
class ReadMessageThread extends Thread{
/*覆寫 Thread 類的 run 方法,在該方法中,回圈從埠讀入資訊,
直到讀入“QUIT”,則關閉套接字*/
public void appendInformation(String str){
final String str1 = str;
Display.getDefault().syncExec(new Runnable() {
public void run(){
textInformation.append(str1);
}
});
public void run(){
String str="";
while(true){
try{
str = cin.readLine(); //讀入資訊
}catch (IOException e){
this.appendInformation ("輸入輸出例外\n");
}
if (str.equals("QUIT")){ //若為“QUIT”,則關閉套接字,跳出回圈
try{
socket.close();
this.appendInformation ("用戶連接已關閉\n");
}catch (IOException e){
this.appendInformation ("套接字關閉例外\n");
}
break;
} else //不是 QUIT 資訊,則將讀入的資訊進行顯示
this.appendInformation("從客戶端讀入如下的資訊:"+str+"\n");
}
}
}
2. 修改服務器端【開始監聽】按鈕事件處理
對 7.2.3 中服務器端的【開始監聽】按鈕的事件處理做修改,將實作收發功能的代碼用
執行緒物件來實作(加黑代碼的為修改部分):
原代碼:
String str = cin.readLine();
textInformation.append("從客戶端讀入如下的資訊:"+str+"\n");
新修改代碼:
/*自定義執行緒物件*/
ReadMessageThread readThread=new ReadMessageThread();
/*通過 start 方法,讓執行緒進入可運行狀態*/
readThread.start();
此時,我們再來運行簡單聊天室的服務器端工程和客戶端工程,則會發現,客戶端每次
發送的資訊能在服務器端實時顯示出來。
7.2.5 實戰演練
在 7.2.4 中,我們已經實作服務器端不停地接收資訊,請對服務器端工程和客戶端工程
做修改,實作如下功能:
1.服務器在接收到來自客戶端的非退出資訊時,發送一條“服務器已接收到你發來的
資訊:XX”資訊到客戶端。
2.服務器在接收到來自客戶端的退出資訊時,發送一條“QUIT”資訊到客戶端。并關
閉連接。
3.客戶端能實時接收服務器發送的資訊,當接收到“QUIT”資訊時,關閉連接。
4.如果對 7.2.4 中的自定義執行緒類要求以外部類的形式存在,請完成該對程式的修改。
JAVA實訓作業,大神幫忙做一下7.2.5實戰演練,今天要交了
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/56636.html
標籤:Eclipse
