Discussion:
[問題] thread問題
(时间太久无法回复)
~~~
2006-08-20 01:58:36 UTC
Permalink
新手的問題

某段聊天程式~
有個thread會跑下面的run

public void run() {

.......(我省略了一些I/O程式碼~沒貼上來)

while((message = theInputStream.readLine()) != null) {

message = "re: " + message + "\n";
chatBox.update();
}

}


我想問的是~這個thread即使第一次跑完while迴圈~
也就是theInputStream.readLine()讀完了~

它之後~還是會三不五時的去檢查theInputStream.readLine()是否有東西
然後再跑迴圈?
其實我想問~第一次迴圈跑完~不就結束了嗎
為何thread之後會知道~還要在check ?






--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.117.67.234
小安
2006-08-20 02:24:07 UTC
Permalink
※ 引述《YRED (~~~)》之銘言:
: 我想問的是~這個thread即使第一次跑完while迴圈~
: 也就是theInputStream.readLine()讀完了~
: 它之後~還是會三不五時的去檢查theInputStream.readLine()是否有東西
: 然後再跑迴圈?
: 其實我想問~第一次迴圈跑完~不就結束了嗎
: 為何thread之後會知道~還要在check ?

我很好奇,你是如何知道 thread 之後有在執行 theInputStream.readLine()

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.126.173.31
~~~
2006-08-20 03:16:12 UTC
Permalink
整個一對一聊天原始碼~
http://www.javaworld.com.tw/jute/post/view?bid=35&id=34182&sty=1&tpg=1&age=0
這個我compiler過了~也確定可執行

每次client或server端丟訊息時~(接enter鍵)
我剛說的while迴圈就會再跑一次~這樣才會看到對方丟的訊息

歹勢~我是新手~
整個程式碼~都看過了~
還是不知道為何會這樣~
然後~我看head first java那本~
也是這樣寫~

※ 引述《tkcn (小安)》之銘言:
: ※ 引述《YRED (~~~)》之銘言:
: : 我想問的是~這個thread即使第一次跑完while迴圈~
: : 也就是theInputStream.readLine()讀完了~
: : 它之後~還是會三不五時的去檢查theInputStream.readLine()是否有東西
: : 然後再跑迴圈?
: : 其實我想問~第一次迴圈跑完~不就結束了嗎
: : 為何thread之後會知道~還要在check ?
: 我很好奇,你是如何知道 thread 之後有在執行 theInputStream.readLine()

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.117.67.234
小安
2006-08-20 05:00:29 UTC
Permalink
※ 引述《YRED (~~~)》之銘言:
: 整個一對一聊天原始碼~
: http://www.javaworld.com.tw/jute/post/view?bid=35&id=34182&sty=1&tpg=1&age=0
: 這個我compiler過了~也確定可執行
: 每次client或server端丟訊息時~(接enter鍵)
: 我剛說的while迴圈就會再跑一次~這樣才會看到對方丟的訊息
: 歹勢~我是新手~
: 整個程式碼~都看過了~
: 還是不知道為何會這樣~
: 然後~我看head first java那本~
: 也是這樣寫~

老實說,你敘述的不是很清楚
我看了很多遍,才真正了解你的意思

其實不管是 readLine() 或著是其他的 read 方法都一樣
要遭遇到 EOF (End Of File) 的時候,其回傳值才會是 null (這裡是以 readLine 為例)

但是呢,網路上的 Stream 在傳送方並沒有傳送資料時,
並不會傳送 EOF,TCP 的連線是一直 keep 住的。

而對於接收方,不管是不是網路的 stream,read 是一種 synchronized IO
簡單的說,在目前這個 thread 一定要完成 read 的動作之後,才能執行下一個指令
(有興趣的話請參考 Operating System)

所以說這支程式並不是離開迴圈、結束 thread,
只是在 readLine() 時進入了 block state,
等待有資料時,這個 thread 才又回到 running state 繼續執行。

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.126.173.31
※ 編輯: tkcn 來自: 59.126.173.31 (08/20 21:00)
Loading...