從學生時代算起,寫程式也已經有好長一段時間,不過有時候還是會覺得少了一點什麼,特別是對最基礎最根本的東西,有時候反而是一知半解,有空會去挖掘,但了解後卻沒什麼記錄下來,想想也蠻可惜的,所以最近開始把一些東西給記錄下來,雖然不敢說有沒有像Teddy學長那樣的毅力持續到能寫出一本書,若能留點紀錄還是一件好事,不過網誌內容和實際內容會有點不同,網誌上會有『疑問』和『部分簡答』,原因就靠客官自己想囉XD。

  最近因為AJAX很紅,搭配jQuery UI或extJS之類的套件,RIA (Rich Internet Application)幾乎快變成顯學了,不過對我這個老人來說,寫Rich Client已經好長一段時間(不論是Java Swing或是Windows Forms),但還是有些疑惑是找了很多資料才發現,原來跟我以前想的不一樣。首先來看圖1,很一般的Java Swing Hello World例子,幾乎在任何教Java Swing的書上都能看到相似的例子,執行後會看到圖2。

HelloWorldExample
圖 1 常見的Java Swing Hello World範例程式

HelloWorldWindow
圖 2 圖1程式碼的執行結果

  Ok,問題來了:

  Q1. 當按下右上角的關閉按鈕時,程式會結束(terminated)嗎?答:不會。
  Q2. 一般來說,程式從main的左大括弧開始到右大括弧結束,圖1的程式在18行就該結束,但為什麼沒有?
  Q3. 一個可能的說法是主程序或主執行緒在17行呼叫setVisible(true)後開始跑迴圈處理事件,所以不會結束,那如果17行之後還有程式碼,會不會被執行呢?答:會。

  類似的問題再來一發,這是之前幫學弟Review程式碼時遇到的問題,當時我看到學弟為了監控多台電腦,啟動非常多的Thread,但都沒有呼叫join,心裡頭覺得納悶,程式到第21行不是就應該結束了嗎?剛建立的執行緒不也應該被終止?不過學弟卻說程式跑得好好地啊?

ThreadWithoutJoinExample
圖3 沒有Join的Thread範例

  問題來了:

  Q4. 雖然剛剛已經講出答案了,不過還是問:需要寫thread.join()嗎?答:看情況,不用為了讓thread繼續執行而寫thread.join()。但如果需要等待thread執行的結果,就需要。
  Q5. 在圖3第20行啟動的執行緒能跑多久?答:run()函式裡是一個無窮迴圈,所以會一直跑下去,直到使用者用類似Ctrl + C的方式送出中止程式的訊號(Signal)。
  Q6. 第20行啟動的執行緒若繼續跑,那原本的主執行緒呢?答:死了。但程序(Process)還活著。

  上述的問題都跟JVM的執行緒模型(Thread Model)有關,但通常會以在作業系統書中所學的Processes and Threads模型來一般化所有平台實際實作的模型,但這不一定是洽當的,作業系統書上的是一般的概論,實際平台的實作卻有很多不同的考量,也就產生出不同的結果,以JVM來說,當一個程式啟動後,其實不只一個主執行緒在執行,因此很多的行為跟書上是不同的。關於上述問題看到這裡的客官有想法嗎?

dbi1463 發表在 痞客邦 留言(0) 人氣()