Be happy with Java

          導(dǎo)航

          <2006年12月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          統(tǒng)計

          常用鏈接

          留言簿(2)

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          2006年12月22日 #

          python 語言類型

          一位博學(xué)的讀者發(fā)給我 Python 如何與其它編程語言的比較的解釋:

          靜態(tài)類型定義語言
          一種在編譯期間數(shù)據(jù)類型固定的語言。大多數(shù)靜態(tài)類型定義語言是通過要求在使用所有變量之前聲明它們的數(shù)據(jù)類型來保證這一點(diǎn)的。 JavaC 是靜態(tài)類型定義語言。
          動態(tài)類型定義語言
          一種在運(yùn)行期間才去確定數(shù)據(jù)類型的語言, 與靜態(tài)類型定義相反。 VBScriptPython 是動態(tài)類型定義的, 因?yàn)樗鼈兇_定一個變量的類型是在您第一次給它賦值的時候。
          強(qiáng)類型定義語言
          一種總是強(qiáng)制類型定義的語言。 JavaPython 是強(qiáng)制類型定義的。您有一個整數(shù), 如果不明確地進(jìn)行轉(zhuǎn)換 , 不能將把它當(dāng)成一個字符串。
          弱類型定義語言
          一種類型可以被忽略的語言, 與強(qiáng)類型定義相反。 VBScript 是弱類型定義的。在 VBScript 中, 您可以將字符串 '12' 和整數(shù) 3 進(jìn)行連接得到字符串'123', 然后可以把它看成整數(shù) 123 , 所有這些都不需要任何的顯示轉(zhuǎn)換。

          所以說 Python 既是 動態(tài)類型定義語言 (因?yàn)樗皇褂蔑@示數(shù)據(jù)類型聲明) , 又是 強(qiáng)類型定義語言 (因?yàn)橐坏┮粋€變量具有一個數(shù)據(jù)類型, 它實(shí)際上就一直是這個類型了) 。

          posted @ 2007-02-13 11:56 SYBIL@BLOGJAVA 閱讀(169) | 評論 (0)編輯 收藏

          unix 高手的10個習(xí)慣,zz

          UNIX 高手的 10 個習(xí)慣

          克服不良的 UNIX 使用模式

          developerWorks
          文檔選項(xiàng)

          未顯示需要 JavaScript 的文檔選項(xiàng)

          將此頁作為電子郵件發(fā)送

          將此頁作為電子郵件發(fā)送

          將此頁作為電子郵件發(fā)送

          將此頁作為電子郵件發(fā)送


          拓展 Tomcat 應(yīng)用

          下載 IBM 開源 J2EE 應(yīng)用服務(wù)器 WAS CE 新版本 V1.1


          級別: 中級

          Michael Stutz (stutz@dsl.org), 作者, 顧問

          2007 年 2 月 09 日

          采用 10 個能夠提高您的 UNIX? 命令行效率的好習(xí)慣——并在此過程中擺脫不良的使用模式。本文循序漸進(jìn)地指導(dǎo)您學(xué)習(xí)幾項(xiàng)用于命令行操作的技術(shù),這些技術(shù)非常好,但是通常被忽略。了解常見錯誤和克服它們的方法,以便您能夠確切了解為何值得采用這些 UNIX 習(xí)慣。

          引言

          當(dāng)您經(jīng)常使用某個系統(tǒng)時,往往會陷入某種固定的使用模式。有時,您沒有養(yǎng)成以盡可能最好的方式做事的習(xí)慣。有時,您的不良習(xí)慣甚至?xí)?dǎo)致出現(xiàn)混亂。糾正此類缺點(diǎn)的最佳方法之一,就是有意識地采用抵制這些壞習(xí)慣的好習(xí)慣。本文提出了 10 個值得采用的 UNIX 命令行習(xí)慣——幫助您克服許多常見使用怪癖,并在該過程中提高命令行工作效率的好習(xí)慣。下面列出了這 10 個好習(xí)慣,之后對進(jìn)行了更詳細(xì)的描述。

          采用 10 個好習(xí)慣

          要采用的十個好習(xí)慣為:

          1. 在單個命令中創(chuàng)建目錄樹
          2. 更改路徑;不要移動存檔
          3. 將命令與控制操作符組合使用
          4. 謹(jǐn)慎引用變量
          5. 使用轉(zhuǎn)義序列來管理較長的輸入
          6. 在列表中對命令分組
          7. find 之外使用 xargs
          8. 了解何時 grep 應(yīng)該執(zhí)行計數(shù)——何時應(yīng)該繞過
          9. 匹配輸出中的某些字段,而不只是對行進(jìn)行匹配
          10. 停止對 cat 使用管道

          在單個命令中創(chuàng)建目錄樹

          清單 1 演示了最常見的 UNIX 壞習(xí)慣之一:一次定義一個目錄樹。


          清單 1. 壞習(xí)慣 1 的示例:單獨(dú)定義每個目錄樹
          	
          ~ $ mkdir tmp
          ~ $ cd tmp
          ~/tmp $ mkdir a
          ~/tmp $ cd a
          ~/tmp/a $ mkdir b
          ~/tmp/a $ cd b
          ~/tmp/a/b/ $ mkdir c
          ~/tmp/a/b/ $ cd c
          ~/tmp/a/b/c $
          

          使用 mkdir-p 選項(xiàng)并在單個命令中創(chuàng)建所有父目錄及其子目錄要容易得多。但是即使對于知道此選項(xiàng)的管理員,他們在命令行上創(chuàng)建子目錄時也仍然束縛于逐步創(chuàng)建每級子目錄。花時間有意識地養(yǎng)成這個好習(xí)慣是值得的:


          清單 2. 好習(xí)慣 1 的示例:使用一個命令來定義目錄樹
          ~ $ mkdir -p tmp/a/b/c

          您可以使用此選項(xiàng)來創(chuàng)建整個復(fù)雜的目錄樹(在腳本中使用是非常理想的),而不只是創(chuàng)建簡單的層次結(jié)構(gòu)。例如:


          清單 3. 好習(xí)慣 1 的另一個示例:使用一個命令來定義復(fù)雜的目錄樹
          ~ $ mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}

          過去,單獨(dú)定義目錄的唯一借口是您的 mkdir 實(shí)現(xiàn)不支持此選項(xiàng),但是在大多數(shù)系統(tǒng)上不再是這樣了。IBM、AIX?、mkdir、GNU mkdir 和其他遵守單一 UNIX 規(guī)范 (Single UNIX Specification) 的系統(tǒng)現(xiàn)在都具有此選項(xiàng)。

          對于仍然缺乏該功能的少數(shù)系統(tǒng),您可以使用 mkdirhier 腳本(請參見參考資料),此腳本是執(zhí)行相同功能的 mkdir 的包裝:

          ~ $ mkdirhier project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}

          更改路徑;不要移動存檔

          另一個不良的使用模式是將 .tar 存檔文件移動到某個目錄,因?yàn)樵撃夸浨『檬悄M谄渲刑崛?.tar 文件的目錄。其實(shí)您根本不需要這樣做。您可以隨心所欲地將任何 .tar 存檔文件解壓縮到任何目錄——這就是 -C 選項(xiàng)的用途。在解壓縮某個存檔文件時,使用 -C 選項(xiàng)來指定要在其中解壓縮該文件的目錄:


          清單 4. 好習(xí)慣 2 的示例:使用選項(xiàng) -C 來解壓縮 .tar 存檔文件
          ~ $ tar xvf -C tmp/a/b/c newarc.tar.gz

          相對于將存檔文件移動到您希望在其中解壓縮它的位置,切換到該目錄,然后才解壓縮它,養(yǎng)成使用 -C 的習(xí)慣則更加可取——當(dāng)存檔文件位于其他某個位置時尤其如此。





          回頁首


          將命令與控制操作符組合使用

          您可能已經(jīng)知道,在大多數(shù) Shell 中,您可以在單個命令行上通過在命令之間放置一個分號 (;) 來組合命令。該分號是 Shell 控制操作符,雖然它對于在單個命令行上將離散的命令串聯(lián)起來很有用,但它并不適用于所有情況。例如,假設(shè)您使用分號來組合兩個命令,其中第二個命令的正確執(zhí)行完全依賴于第一個命令的成功完成。如果第一個命令未按您預(yù)期的那樣退出,第二個命令仍然會運(yùn)行——結(jié)果會導(dǎo)致失敗。相反,應(yīng)該使用更適當(dāng)?shù)目刂撇僮鞣ū疚膶⒚枋銎渲械牟糠植僮鞣V灰?Shell 支持它們,就值得養(yǎng)成使用它們的習(xí)慣。

          僅當(dāng)另一個命令返回零退出狀態(tài)時才運(yùn)行某個命令

          使用 && 控制操作符來組合兩個命令,以便僅當(dāng) 第一個命令返回零退出狀態(tài)時才運(yùn)行第二個命令。換句話說,如果第一個命令運(yùn)行成功,則第二個命令將運(yùn)行。如果第一個命令失敗,則第二個命令根本就不運(yùn)行。例如:


          清單 5. 好習(xí)慣 3 的示例:將命令與控制操作符組合使用
          ~ $ cd tmp/a/b/c && tar xvf ~/archive.tar

          在此例中,存檔的內(nèi)容將提取到 ~/tmp/a/b/c 目錄中,除非該目錄不存在。如果該目錄不存在,則 tar 命令不會運(yùn)行,因此不會提取任何內(nèi)容。

          僅當(dāng)另一個命令返回非零退出狀態(tài)時才運(yùn)行某個命令

          類似地,|| 控制操作符分隔兩個命令,并且僅當(dāng)?shù)谝粋€命令返回非零退出狀態(tài)時才運(yùn)行第二個命令。換句話說,如果第一個命令成功,則第二個命令不會運(yùn)行。如果第一個命令失敗,則第二個命令才會 運(yùn)行。在測試某個給定目錄是否存在時,通常使用此操作符,如果該目錄不存在,則創(chuàng)建它:


          清單 6. 好習(xí)慣 3 的另一個示例:將命令與控制操作符組合使用
          ~ $ cd tmp/a/b/c || mkdir -p tmp/a/b/c

          您還可以組合使用本部分中描述的控制操作符。每個操作符都影響最后的命令運(yùn)行:


          清單 7. 好習(xí)慣 3 的組合示例:將命令與控制操作符組合使用
          ~ $ cd tmp/a/b/c || mkdir -p tmp/a/b/c && tar xvf -C tmp/a/b/c ~/archive.tar





          回頁首


          謹(jǐn)慎引用變量

          始終要謹(jǐn)慎使用 Shell 擴(kuò)展和變量名稱。一般最好將變量調(diào)用包括在雙引號中,除非您有不這樣做的足夠理由。類似地,如果您直接在字母數(shù)字文本后面使用變量名稱,則還要確保將該變量名稱包括在方括號 ([]) 中,以使其與周圍的文本區(qū)分開來。否則,Shell 將把尾隨文本解釋為變量名稱的一部分——并且很可能返回一個空值。清單 8 提供了變量的各種引用和非引用及其影響的示例。


          清單 8. 好習(xí)慣 4 的示例:引用(和非引用)變量
          ~ $ ls tmp/
          a b
          ~ $ VAR="tmp/*"
          ~ $ echo $VAR
          tmp/a tmp/b
          ~ $ echo "$VAR"
          tmp/*
          ~ $ echo $VARa
          
          ~ $ echo "$VARa"
          
          ~ $ echo "${VAR}a"
          tmp/*a
          ~ $ echo ${VAR}a
          tmp/a
          ~ $
          





          回頁首


          使用轉(zhuǎn)義序列來管理較長的輸入

          您或許看到過使用反斜杠 (\) 來將較長的行延續(xù)到下一行的代碼示例,并且您知道大多數(shù) Shell 都將您通過反斜杠聯(lián)接的后續(xù)行上鍵入的內(nèi)容視為單個長行。然而,您可能沒有在命令行中像通常那樣利用此功能。如果您的終端無法正確處理多行回繞,或者您的命令行比通常小(例如在提示符下有長路經(jīng)的時候),反斜杠就特別有用。反斜杠對于了解鍵入的長輸入行的含義也非常有用,如以下示例所示:


          清單 9. 好習(xí)慣 5 的示例:將反斜杠用于長輸入
          ~ $ cd tmp/a/b/c || \
          > mkdir -p tmp/a/b/c && \
          > tar xvf -C tmp/a/b/c ~/archive.tar

          或者,也可以使用以下配置:


          清單 10. 好習(xí)慣 5 的替代示例:將反斜杠用于長輸入
          ~ $ cd tmp/a/b/c \
          >                 || \
          > mkdir -p tmp/a/b/c \
          >                    && \
          > tar xvf -C tmp/a/b/c ~/archive.tar

          然而,當(dāng)您將輸入行劃分到多行上時,Shell 始終將其視為單個連續(xù)的行,因?yàn)樗偸莿h除所有反斜杠和額外的空格。

          注意:在大多數(shù) Shell 中,當(dāng)您按向上箭頭鍵時,整個多行輸入將重繪到單個長輸入行上。





          回頁首


          在列表中對命令分組

          大多數(shù) Shell 都具有在列表中對命令分組的方法,以便您能將它們的合計輸出向下傳遞到某個管道,或者將其任何部分或全部流重定向到相同的地方。您一般可以通過在某個 Subshell 中運(yùn)行一個命令列表或通過在當(dāng)前 Shell 中運(yùn)行一個命令列表來實(shí)現(xiàn)此目的。

          在 Subshell 中運(yùn)行命令列表

          使用括號將命令列表包括在單個組中。這樣做將在一個新的 Subshell 中運(yùn)行命令,并允許您重定向或收集整組命令的輸出,如以下示例所示:


          清單 11. 好習(xí)慣 6 的示例:在 Subshell 中運(yùn)行命令列表
          ~ $ ( cd tmp/a/b/c/ || mkdir -p tmp/a/b/c && \
          > VAR=$PWD; cd ~; tar xvf -C $VAR archive.tar ) \
          > | mailx admin -S "Archive contents"

          在此示例中,該存檔的內(nèi)容將提取到 tmp/a/b/c/ 目錄中,同時將分組命令的輸出(包括所提取文件的列表)通過郵件發(fā)送到地址 admin

          當(dāng)您在命令列表中重新定義環(huán)境變量,并且您不希望將那些定義應(yīng)用于當(dāng)前 Shell 時,使用 Subshell 更可取。

          在當(dāng)前 Shell 中運(yùn)行命令列表

          將命令列表用大括號 ({}) 括起來,以在當(dāng)前 Shell 中運(yùn)行。確保在括號與實(shí)際命令之間包括空格,否則 Shell 可能無法正確解釋括號。此外,還要確保列表中的最后一個命令以分號結(jié)尾,如以下示例所示:


          清單 12. 好習(xí)慣 6 的另一個示例:在當(dāng)前 Shell 中運(yùn)行命令列表
          ~ $ { cp ${VAR}a . && chown -R guest.guest a && \
          > tar cvf newarchive.tar a; } | mailx admin -S "New archive"





          回頁首


          在 find 之外使用 xargs

          使用 xargs 工具作為篩選器,以充分利用從 find 命令挑選的輸出。find 運(yùn)行通常提供與某些條件匹配的文件列表。此列表被傳遞到 xargs 上,后者然后使用該文件列表作為參數(shù)來運(yùn)行其他某些有用的命令,如以下示例所示:


          清單 13. xargs 工具的經(jīng)典用法示例
          ~ $ find some-file-criteria some-file-path | \
          > xargs some-great-command-that-needs-filename-arguments

          然而,不要將 xargs 僅看作是 find 的輔助工具;它是一個未得到充分利用的工具之一,當(dāng)您養(yǎng)成使用它的習(xí)慣時,將會希望進(jìn)行所有試驗(yàn),包括以下用法。

          傳遞空格分隔的列表

          在最簡單的調(diào)用形式中,xargs 就像一個篩選器,它接受一個列表(每個成員分別在單獨(dú)的行上)作為輸入。該工具將那些成員放置在單個空格分隔的行上:


          清單 14. xargs 工具產(chǎn)生的輸出示例
          ~ $ xargsabcControl-D
          a b c
          ~ $
          

          您可以發(fā)送通過 xargs 來輸出文件名的任何工具的輸出,以便為其他某些接受文件名作為參數(shù)的工具獲得參數(shù)列表,如以下示例所示:


          清單 15. xargs 工具的使用示例
          ~/tmp $ ls -1 | xargs
          December_Report.pdf README a archive.tar mkdirhier.sh
          ~/tmp $ ls -1 | xargs file
          December_Report.pdf: PDF document, version 1.3
          README: ASCII text
          a: directory
          archive.tar: POSIX tar archive
          mkdirhier.sh: Bourne shell script text executable
          ~/tmp $
          

          xargs 命令不只用于傳遞文件名。您還可以在需要將文本篩選到單個行中的任何時候使用它:


          清單 16. 好習(xí)慣 7 的示例:使用 xargs 工具來將文本篩選到單個行中
          ~/tmp $ ls -l | xargs
          -rw-r--r-- 7 joe joe 12043 Jan 27 20:36 December_Report.pdf -rw-r--r-- 1 \
          root root 238 Dec 03 08:19 README drwxr-xr-x 38 joe joe 354082 Nov 02 \
          16:07 a -rw-r--r-- 3 joe joe 5096 Dec 14 14:26 archive.tar -rwxr-xr-x 1 \
          joe joe 3239 Sep 30 12:40 mkdirhier.sh
          ~/tmp $
          

          謹(jǐn)慎使用 xargs

          從技術(shù)上講,使用 xargs 很少遇到麻煩。缺省情況下,文件結(jié)束字符串是下劃線 (_);如果將該字符作為單個輸入?yún)?shù)來發(fā)送,則它之后的所有內(nèi)容將被忽略。為了防止這種情況發(fā)生,可以使用 -e 標(biāo)志,它在不帶參數(shù)的情況下完全禁用結(jié)束字符串。





          回頁首


          了解何時 grep 應(yīng)該執(zhí)行計數(shù)——何時應(yīng)該繞過

          避免通過管道將 grep 發(fā)送到 wc -l 來對輸出行數(shù)計數(shù)。grep-c 選項(xiàng)提供了對與特定模式匹配的行的計數(shù),并且一般要比通過管道發(fā)送到 wc 更快,如以下示例所示:


          清單 17. 好習(xí)慣 8 的示例:使用和不使用 grep 的行計數(shù)
          ~ $ time grep and tmp/a/longfile.txt | wc -l
          2811
          
          real    0m0.097s
          user    0m0.006s
          sys     0m0.032s
          ~ $ time grep -c and tmp/a/longfile.txt
          2811
          
          real    0m0.013s
          user    0m0.006s
          sys     0m0.005s
          ~ $ 
          

          除了速度因素外,-c 選項(xiàng)還是執(zhí)行計數(shù)的好方法。對于多個文件,帶 -c 選項(xiàng)的 grep 返回每個文件的單獨(dú)計數(shù),每行一個計數(shù),而針對 wc 的管道則提供所有文件的組合總計數(shù)。

          然而,不管是否考慮速度,此示例都表明了另一個要避免地常見錯誤。這些計數(shù)方法僅提供包含匹配模式的行數(shù)——如果那就是您要查找的結(jié)果,這沒什么問題。但是在行中具有某個特定模式的多個實(shí)例的情況下,這些方法無法為您提供實(shí)際匹配實(shí)例數(shù)量 的真實(shí)計數(shù)。歸根結(jié)底,若要對實(shí)例計數(shù),您還是要使用 wc 來計數(shù)。首先,使用 -o 選項(xiàng)(如果您的版本支持它的話)來運(yùn)行 grep 命令。此選項(xiàng) 輸出匹配的模式,每行一個模式,而不輸出行本身。但是您不能將它與 -c 選項(xiàng)結(jié)合使用,因此要使用 wc -l 來對行計數(shù),如以下示例所示:


          清單 18. 好習(xí)慣 8 的示例:使用 grep 對模式實(shí)例計數(shù)
          ~ $ grep -o and tmp/a/longfile.txt | wc -l
          3402
          ~ $
          

          在此例中,調(diào)用 wc 要比第二次調(diào)用 grep 并插入一個虛擬模式(例如 grep -c)來對行進(jìn)行匹配和計數(shù)稍快一點(diǎn)。





          回頁首


          匹配輸出中的某些字段,而不只是對行進(jìn)行匹配

          當(dāng)您只希望匹配輸出行中特定字段 中的模式時,諸如 awk 等工具要優(yōu)于 grep

          下面經(jīng)過簡化的示例演示了如何僅列出 12 月修改過的文件。


          清單 19. 壞習(xí)慣 9 的示例:使用 grep 來查找特定字段中的模式
          ~/tmp $ ls -l /tmp/a/b/c | grep Dec
          -rw-r--r--  7 joe joe  12043 Jan 27 20:36 December_Report.pdf
          -rw-r--r--  1 root root  238 Dec 03 08:19 README
          -rw-r--r--  3 joe joe   5096 Dec 14 14:26 archive.tar
          ~/tmp $
          

          在此示例中,grep 對行進(jìn)行篩選,并輸出其修改日期和名稱中帶 Dec 的所有文件。因此,諸如 December_Report.pdf 等文件是匹配的,即使它自從一月份以來還未修改過。這可能不是您希望的結(jié)果。為了匹配特定字段中的模式,最好使用 awk,其中的一個關(guān)系運(yùn)算符對確切的字段進(jìn)行匹配,如以下示例所示:


          清單 20. 好習(xí)慣 9 的示例:使用 awk 來查找特定字段中的模式
          ~/tmp $ ls -l | awk '$6 == "Dec"'
          -rw-r--r--  3 joe joe   5096 Dec 14 14:26 archive.tar
          -rw-r--r--  1 root root  238 Dec 03 08:19 README
          ~/tmp $
          

          有關(guān)如何使用 awk 的更多詳細(xì)信息,請參見參考資料





          回頁首


          停止對 cat 使用管道

          grep 的一個常見的基本用法錯誤是通過管道將 cat 的輸出發(fā)送到 grep 以搜索單個文件的內(nèi)容。這絕對是不必要的,純粹是浪費(fèi)時間,因?yàn)橹T如 grep 這樣的工具接受文件名作為參數(shù)。您根本不需要在這種情況下使用 cat,如以下示例所示:


          清單 21. 好習(xí)慣和壞習(xí)慣 10 的示例:使用帶和不帶 cat 的 grep
          	
          ~ $ time cat tmp/a/longfile.txt | grep and
          2811
          
          real    0m0.015s
          user    0m0.003s
          sys     0m0.013s
          ~ $ time grep and tmp/a/longfile.txt
          2811
          
          real    0m0.010s
          user    0m0.006s
          sys     0m0.004s
          ~ $ 
          

          此錯誤存在于許多工具中。由于大多數(shù)工具都接受使用連字符 (-) 的標(biāo)準(zhǔn)輸入作為一個參數(shù),因此即使使用 cat 來分散 stdin 中的多個文件,參數(shù)也通常是無效的。僅當(dāng)您使用帶多個篩選選項(xiàng)之一的 cat 時,才真正有必要在管道前首先執(zhí)行連接。





          回頁首


          結(jié)束語:養(yǎng)成好習(xí)慣

          最好檢查一下您的命令行習(xí)慣中的任何不良的使用模式。不良的使用模式會降低您的速度,并且通常會導(dǎo)致意外錯誤。本文介紹了 10 個新習(xí)慣,它們可以幫助您擺脫許多最常見的使用錯誤。養(yǎng)成這些好習(xí)慣是加強(qiáng)您的 UNIX 命令行技能的積極步驟。

          posted @ 2007-02-12 17:39 SYBIL@BLOGJAVA 閱讀(151) | 評論 (0)編輯 收藏

          線程池

          100行Java代碼構(gòu)建一個線程池

          在現(xiàn)代的操作系統(tǒng)中,有一個很重要的概念――線程,幾乎所有目前流行的操作系統(tǒng)都支持線程,線程來源于操作系統(tǒng)中進(jìn)程的概念,進(jìn)程有自己的虛擬地址空間以及正文段、數(shù)據(jù)段及堆棧,而且各自占有不同的系統(tǒng)資源(例如文件、環(huán)境變量等等)。與此不同,線程不能單獨(dú)存在,它依附于進(jìn)程,只能由進(jìn)程派生。如果一個進(jìn)程派生出了兩個線程,那這兩個線程共享此進(jìn)程的全局變量和代碼段,但每個線程各擁有各自的堆棧,因此它們擁有各自的局部變量,線程在UNIX系統(tǒng)中還被進(jìn)一步分為用戶級線程(由進(jìn)程自已來管理)和系統(tǒng)級線程(由操作系統(tǒng)的調(diào)度程序來管理)。

            既然有了進(jìn)程,為什么還要提出線程的概念呢?因?yàn)榕c創(chuàng)建一個新的進(jìn)程相比,創(chuàng)建一個線程將會耗費(fèi)小得多的系統(tǒng)資源,對于一些小型的應(yīng)用,可能感覺不到這點(diǎn),但對于那些并發(fā)進(jìn)程數(shù)特別多的應(yīng)用,使用線程會比使用進(jìn)程獲得更好的性能,從而降低操作系統(tǒng)的負(fù)擔(dān)。另外,線程共享創(chuàng)建它的進(jìn)程的全局變量,因此線程間的通訊編程會更將簡單,完全可以拋棄傳統(tǒng)的進(jìn)程間通訊的IPC編程,而采用共享全局變量來進(jìn)行線程間通訊。

            有了上面這個概念,我們下面就進(jìn)入正題,來看一下線程池究竟是怎么一回事?其實(shí)線程池的原理很簡單,類似于操作系統(tǒng)中的緩沖區(qū)的概念,它的流程如下:先啟動若干數(shù)量的線程,并讓這些線程都處于睡眠狀態(tài),當(dāng)客戶端有一個新請求時,就會喚醒線程池中的某一個睡眠線程,讓它來處理客戶端的這個請求,當(dāng)處理完這個請求后,線程又處于睡眠狀態(tài)。可能你也許會問:為什么要搞得這么麻煩,如果每當(dāng)客戶端有新的請求時,我就創(chuàng)建一個新的線程不就完了?這也許是個不錯的方法,因?yàn)樗苁沟媚憔帉懘a相對容易一些,但你卻忽略了一個重要的問題――性能!就拿我所在的單位來說,我的單位是一個省級數(shù)據(jù)大集中的銀行網(wǎng)絡(luò)中心,高峰期每秒的客戶端請求并發(fā)數(shù)超過100,如果為每個客戶端請求創(chuàng)建一個新線程的話,那耗費(fèi)的CPU時間和內(nèi)存將是驚人的,如果采用一個擁有200個線程的線程池,那將會節(jié)約大量的的系統(tǒng)資源,使得更多的CPU時間和內(nèi)存用來處理實(shí)際的商業(yè)應(yīng)用,而不是頻繁的線程創(chuàng)建與銷毀。

            既然一切都明白了,那我們就開始著手實(shí)現(xiàn)一個真正的線程池吧,線程編程可以有多種語言來實(shí)現(xiàn),例如C、C++、java等等,但不同的操作系統(tǒng)提供不同的線程API接口,為了讓你能更明白線程池的原理而避免陷入煩瑣的API調(diào)用之中,我采用了JAVA語言來實(shí)現(xiàn)它,由于JAVA語言是一種跨平臺的語言,因此你不必為使用不同的操作系統(tǒng)而無法編譯運(yùn)行本程序而苦惱,只要你安裝了JDK1.2以上的版本,都能正確地編譯運(yùn)行本程序。另外JAVA語言本身就內(nèi)置了線程對象,而且JAVA語言是完全面像對象的,因此能夠讓你更清晰地了解線程池的原理,如果你注意看一下本文的標(biāo)題,你會發(fā)現(xiàn)整個示例程序的代碼只有大約100行。

            本示例程序由三個類構(gòu)成,第一個是TestThreadPool類,它是一個測試程序,用來模擬客戶端的請求,當(dāng)你運(yùn)行它時,系統(tǒng)首先會顯示線程池的初始化信息,然后提示你從鍵盤上輸入字符串,并按下回車鍵,這時你會發(fā)現(xiàn)屏幕上顯示信息,告訴你某個線程正在處理你的請求,如果你快速地輸入一行行字符串,那么你會發(fā)現(xiàn)線程池中不斷有線程被喚醒,來處理你的請求,在本例中,我創(chuàng)建了一個擁有10個線程的線程池,如果線程池中沒有可用線程了,系統(tǒng)會提示你相應(yīng)的警告信息,但如果你稍等片刻,那你會發(fā)現(xiàn)屏幕上會陸陸續(xù)續(xù)提示有線程進(jìn)入了睡眠狀態(tài),這時你又可以發(fā)送新的請求了。

            第二個類是ThreadPoolManager類,顧名思義,它是一個用于管理線程池的類,它的主要職責(zé)是初始化線程池,并為客戶端的請求分配不同的線程來進(jìn)行處理,如果線程池滿了,它會對你發(fā)出警告信息。

            最后一個類是SimpleThread類,它是Thread類的一個子類,它才真正對客戶端的請求進(jìn)行處理,SimpleThread在示例程序初始化時都處于睡眠狀態(tài),但如果它接受到了ThreadPoolManager類發(fā)過來的調(diào)度信息,則會將自己喚醒,并對請求進(jìn)行處理。


            首先我們來看一下TestThreadPool類的源碼:



          //TestThreadPool.java
          1 import java.io.*;
          2
          3
          4 public class TestThreadPool
          5 {
          6 public static void main(String[] args)
          7 {
          8 try{
          9 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
          10 String s;
          11 ThreadPoolManager manager = new ThreadPoolManager(10);
          12 while((s = br.readLine()) != null)
          13 {
          14 manager.process(s);
          15 }
          16 }catch(IOException e){}
          17 }
          18 }



            由于此測試程序用到了輸入輸入類,因此第1行導(dǎo)入了JAVA的基本IO處理包,在第11行中,我們創(chuàng)建了一個名為manager的類,它給ThreadPoolManager類的構(gòu)造函數(shù)傳遞了一個值為10的參數(shù),告訴ThreadPoolManager類:我要一個有10個線程的池,給我創(chuàng)建一個吧!第12行至15行是一個無限循環(huán),它用來等待用戶的鍵入,并將鍵入的字符串保存在s變量中,并調(diào)用ThreadPoolManager類的process方法來將這個請求進(jìn)行處理。

            下面我們再進(jìn)一步跟蹤到ThreadPoolManager類中去,以下是它的源代碼:



          //ThreadPoolManager.java
          1 import java.util.*;
          2
          3
          4 class ThreadPoolManager
          5 {
          6
          7 private int maxThread;
          8 public Vector vector;
          9 public void setMaxThread(int threadCount)
          10 {
          11 maxThread = threadCount;
          12 }
          13
          14 public ThreadPoolManager(int threadCount)
          15 {
          16 setMaxThread(threadCount);
          17 System.out.println("Starting thread pool...");
          18 vector = new Vector();
          19 for(int i = 1; i <= 10; i++)
          20 {
          21 SimpleThread thread = new SimpleThread(i);
          22 vector.addElement(thread);
          23 thread.start();
          24 }
          25 }
          26
          27 public void process(String argument)
          28 {
          29 int i;
          30 for(i = 0; i < vector.size(); i++)
          31 {
          32 SimpleThread currentThread = (SimpleThread)vector.elementAt(i);
          33 if(!currentThread.isRunning())
          34 {
          35 System.out.println("Thread "+ (i+1) +" is processing:" +
          argument);
          36 currentThread.setArgument(argument);
          37 currentThread.setRunning(true);
          38 return;
          39 }
          40 }
          41 if(i == vector.size())
          42 {
          43 System.out.println("pool is full, try in another time.");
          44 }
          45 }
          46 }//end of class ThreadPoolManager



            我們先關(guān)注一下這個類的構(gòu)造函數(shù),然后再看它的process()方法。第16-24行是它的構(gòu)造函數(shù),首先它給ThreadPoolManager類的成員變量maxThread賦值,maxThread表示用于控制線程池中最大線程的數(shù)量。第18行初始化一個數(shù)組vector,它用來存放所有的SimpleThread類,這時候就充分體現(xiàn)了JAVA語言的優(yōu)越性與藝術(shù)性:如果你用C語言的話,至少要寫100行以上的代碼來完成vector的功能,而且C語言數(shù)組只能容納類型統(tǒng)一的基本數(shù)據(jù)類型,無法容納對象。好了,閑話少說,第19-24行的循環(huán)完成這樣一個功能:先創(chuàng)建一個新的SimpleThread類,然后將它放入vector中去,最后用thread.start()來啟動這個線程,為什么要用start()方法來啟動線程呢?因?yàn)檫@是JAVA語言中所規(guī)定的,如果你不用的話,那這些線程將永遠(yuǎn)得不到激活,從而導(dǎo)致本示例程序根本無法運(yùn)行。

            下面我們再來看一下process()方法,第30-40行的循環(huán)依次從vector數(shù)組中選取SimpleThread線程,并檢查它是否處于激活狀態(tài)(所謂激活狀態(tài)是指此線程是否正在處理客戶端的請求),如果處于激活狀態(tài)的話,那繼續(xù)查找vector數(shù)組的下一項(xiàng),如果vector數(shù)組中所有的線程都處于激活狀態(tài)的話,那它會打印出一條信息,提示用戶稍候再試。相反如果找到了一個睡眠線程的話,那第35-38行會對此進(jìn)行處理,它先告訴客戶端是哪一個線程來處理這個請求,然后將客戶端的請求,即字符串a(chǎn)rgument轉(zhuǎn)發(fā)給SimpleThread類的setArgument()方法進(jìn)行處理,并調(diào)用SimpleThread類的setRunning()方法來喚醒當(dāng)前線程,來對客戶端請求進(jìn)行處理。

            可能你還對setRunning()方法是怎樣喚醒線程的有些不明白,那我們現(xiàn)在就進(jìn)入最后一個類:SimpleThread類,它的源代碼如下:

          //SimpleThread.java
          1 class SimpleThread extends Thread
          2 {
          3 private boolean runningFlag;
          4 private String argument;
          5 public boolean isRunning()
          6 {
          7 return runningFlag;
          8 }
          9 public synchronized void setRunning(boolean flag)
          10 {
          11 runningFlag = flag;
          12 if(flag)
          13 this.notify();
          14 }
          15
          16 public String getArgument()
          17 {
          18 return this.argument;
          19 }
          20 public void setArgument(String string)
          21 {
          22 argument = string;
          23 }
          24
          25 public SimpleThread(int threadNumber)
          26 {
          27 runningFlag = false;
          28 System.out.println("thread " + threadNumber + "started.");
          29 }
          30
          31 public synchronized void run()
          32 {
          33 try{
          34 while(true)
          35 {
          36 if(!runningFlag)
          37 {
          38 this.wait();
          39 }
          40 else
          41 {
          42 System.out.println("processing " + getArgument() + "... done.");
          43 sleep(5000);
          44 System.out.println("Thread is sleeping...");
          45 setRunning(false);
          46 }
          47 }
          48 } catch(InterruptedException e){
          49 System.out.println("Interrupt");
          50 }
          51 }//end of run()
          52 }//end of class SimpleThread

            如果你對JAVA的線程編程有些不太明白的話,那我先在這里簡單地講解一下,JAVA有一個名為Thread的類,如果你要創(chuàng)建一個線程,則必須要從Thread類中繼承,并且還要實(shí)現(xiàn)Thread類的run()接口,要激活一個線程,必須調(diào)用它的start()方法,start()方法會自動調(diào)用run()接口,因此用戶必須在run()接口中寫入自己的應(yīng)用處理邏輯。那么我們怎么來控制線程的睡眠與喚醒呢?其實(shí)很簡單,JAVA語言為所有的對象都內(nèi)置了wait()和notify()方法,當(dāng)一個線程調(diào)用wait()方法時,則線程進(jìn)入睡眠狀態(tài),就像停在了當(dāng)前代碼上了,也不會繼續(xù)執(zhí)行它以下的代碼了,當(dāng)調(diào)用notify()方法時,則會從調(diào)用wait()方法的那行代碼繼續(xù)執(zhí)行以下的代碼,這個過程有點(diǎn)像編譯器中的斷點(diǎn)調(diào)試的概念。以本程序?yàn)槔?8行調(diào)用了wait()方法,則這個線程就像凝固了一樣停在了38行上了,如果我們在第13行進(jìn)行一個notify()調(diào)用的話,那線程會從第38行上喚醒,繼續(xù)從第39行開始執(zhí)行以下的代碼了。

            通過以上的講述,我們現(xiàn)在就不難理解SimpleThread類了,第9-14行通過設(shè)置一個標(biāo)志runningFlag激活當(dāng)前線程,第25-29行是SimpleThread類的構(gòu)造函數(shù),它用來告訴客戶端啟動的是第幾號進(jìn)程。第31-50行則是我實(shí)現(xiàn)的run()接口,它實(shí)際上是一個無限循環(huán),在循環(huán)中首先判斷一下標(biāo)志runningFlag,如果沒有runningFlag為false的話,那線程處理睡眠狀態(tài),否則第42-45行會進(jìn)行真正的處理:先打印用戶鍵入的字符串,然后睡眠5秒鐘,為什么要睡眠5秒鐘呢?如果你不加上這句代碼的話,由于計算機(jī)處理速度遠(yuǎn)遠(yuǎn)超過你的鍵盤輸入速度,因此你看到的總是第1號線程來處理你的請求,從而達(dá)不到演示效果。最后第45行調(diào)用setRunning()方法又將線程置于睡眠狀態(tài),等待新請求的到來。

            最后還有一點(diǎn)要注意的是,如果你在一個方法中調(diào)用了wait()和notify()函數(shù),那你一定要將此方法置為同步的,即synchronized,否則在編譯時會報錯,并得到一個莫名其妙的消息:“current thread not owner”(當(dāng)前線程不是擁有者)。

            至此為止,我們完整地實(shí)現(xiàn)了一個線程池,當(dāng)然,這個線程池只是簡單地將客戶端輸入的字符串打印到了屏幕上,而沒有做任何處理,對于一個真正的企業(yè)級運(yùn)用,本例還是遠(yuǎn)遠(yuǎn)不夠的,例如錯誤處理、線程的動態(tài)調(diào)整、性能優(yōu)化、臨界區(qū)的處理、客戶端報文的定義等等都是值得考慮的問題,但本文的目的僅僅只是讓你了解線程池的概念以及它的簡單實(shí)現(xiàn),如果你想成為這方面的高手,本文是遠(yuǎn)遠(yuǎn)不夠的,你應(yīng)該參考一些更多的資料來深入地了解它。

          posted @ 2007-02-04 12:28 SYBIL@BLOGJAVA 閱讀(790) | 評論 (0)編輯 收藏

          這就不行了?

          for ?( int ?i? = ? 1 ;?i? <= ? 10 ;?i ++ )? {
          // ????????????????int?i?=?7;
          ????????????MNPClientThread?mnpct? = ? new ?MNPClientThread(i);

          ????????????mnpct.start();
          ????????????System.out.println(i);
          ????????}

          public ?MNPClientThread( int ?i)? {
          ????????
          this .count? = ?i;
          ????}


          ????
          public ? void ?run()? {
          ????????
          try ? {
          ????????????
          for ( int ?i = 1 ;i <= 800000 ;i ++ ) {
          ????????????????StringBuffer?phoneNumber?
          = ? new ?StringBuffer( " 88600 " );
          ????????????????phoneNumber.append(count);
          ????????????????phoneNumber.append(
          " 0000 " );
          ????????????????phoneNumber.append(i);
          ????????????????Thread.sleep(
          800 );
          // ????????????????System.out.println("****************"+phoneNumber.toString());
          ????????????????MNPClientTest?client? = ? new ?MNPClientTest();
          ????????????????client.runTest(phoneNumber.toString());
          // ????????????java.util.Date?d2?=?new?java.util.Date();
          ????????????????System.out.println( " Thread? " ? + ?count? + ? " ?Runs " );
          // ????????????????System.out.println(new?java.util.Date());
          // ????????????????System.out.println(i);
          ????????????}

          ????????}
          ? catch ?(Exception?ex)? {
          ????????????ex.printStackTrace();
          ????????}

          ????}

          運(yùn)行3小時左右,發(fā)了不到10Wquery就掛了???
          報這個:
          Exception in thread "Thread-1" java.lang.OutOfMemoryError: Java heap space

          我加了-Xms128m -Xmx800m 還是不行?是內(nèi)存泄露嗎??

          posted @ 2007-02-02 15:54 SYBIL@BLOGJAVA 閱讀(592) | 評論 (2)編輯 收藏

          links read

          ENUM:
          http://www.ptsn.net.cn/article_new/show_article.php?article_id=expert_9039d306-6d61-d622-14d5-43c49c788fef

          e164:
          http://www.mc21st.net/old/faq/reply.asp?ID=7471

          IMSI:
          http://zhidao.baidu.com/question/7853752.html

          http://baike.baidu.com/view/715091.htm

          posted @ 2007-01-25 11:59 SYBIL@BLOGJAVA 閱讀(229) | 評論 (0)編輯 收藏

          ……忘了轉(zhuǎn)正這件事了

          一言難盡

          posted @ 2007-01-21 13:08 SYBIL@BLOGJAVA 閱讀(228) | 評論 (0)編輯 收藏

          第一章 思考題與練習(xí)題[原]

          第一章??? 思考題與練習(xí)題

          ?

          1. 什么是移動通信?能否說移動通信就是“無線電通信”?為什么?

          移動通信是指通信雙方或至少有一方在移動中進(jìn)行信息交換的通信方式。

          不能,移動通信是有線、無線相結(jié)合的通信方式。

          2. 移動通信有哪些特點(diǎn)?存在的問題分別用哪些方法解決?

          移動通信是有線、無線相結(jié)合的通信方式;電波傳播條件惡劣,存在嚴(yán)重的多徑衰落;強(qiáng)干擾條件下工作;具有多卜勒效應(yīng);存在陰影區(qū)(盲區(qū));用戶經(jīng)常移動。

          移動臺必須體積要小、重量要輕、操作使用要簡便安全,另外,其成本要低;在進(jìn)行移動通信系統(tǒng)的設(shè)計時,必須具有一定的抗衰落的能力和儲備;移動通信設(shè)備必須具有良好的選擇性,使用自動功率控制電路,移動通信系統(tǒng)在組網(wǎng)時,必須考慮同頻干擾;鎖相技術(shù);考慮陰影區(qū)在網(wǎng)絡(luò)規(guī)劃、設(shè)置基站時;位置登記、越區(qū)切換及漫游訪問等跟蹤交換技術(shù)。

          3. 移動通信常用的工作方式有哪些?公用蜂窩移動電話系統(tǒng)中使用哪些?

          單工方式,半雙工方式,雙工方式。

          雙工。

          4. 什么是小區(qū)制?為什么小區(qū)制既能解決頻道數(shù)有限和用戶數(shù)增大的矛盾,又能不斷適應(yīng)用戶數(shù)增大的需要?

          小區(qū)制是將整個服務(wù)區(qū)劃分為若干個小無線區(qū),每個小無線區(qū)分別設(shè)置一個基站負(fù)責(zé)本區(qū)的移動通信的聯(lián)絡(luò)和控制,同時又可在 MSC 的統(tǒng)一控制下,實(shí)現(xiàn)小區(qū)間移動通信的轉(zhuǎn)接及與市話網(wǎng)的聯(lián)系。

          小區(qū)制中,每個小區(qū)使用一組頻道,鄰近小區(qū)使用不同的頻道。由于小區(qū)內(nèi)基站服務(wù)區(qū)域縮小,同頻復(fù)用距離減小,所以在整個服務(wù)區(qū)中,同一組頻道可以多次重復(fù)使用,因而大大提高了頻率利用率。另外,在區(qū)域內(nèi)可根據(jù)用戶的多少確定小區(qū)的大小。隨著用戶數(shù)目的增加,小區(qū)還可以繼續(xù)劃小,即實(shí)現(xiàn)“小區(qū)分裂”,以適應(yīng)用戶數(shù)的增加。因此,小區(qū)制解決了大區(qū)制中存在的頻道數(shù)有限而用戶數(shù)不斷增加的矛盾,可使用戶容量大大增加。

          5. 無線區(qū)域的劃分為什么采用正六邊形小區(qū)形狀?正六邊形無線區(qū)群構(gòu)成應(yīng)滿足什么條件?

          假定整個服務(wù)區(qū)的地形地物相同,并且基站采用全向天線,覆蓋面積大體上上一個圓,即無線小區(qū)是圓形的。由考慮到多個小區(qū)彼此鄰接來覆蓋整個區(qū)域,用圓內(nèi)接正多邊形代替圓。圓內(nèi)接正多邊形彼此鄰接構(gòu)成平面時,只能是正三角形、正方形和正六邊形三種面狀區(qū)域。正六邊形,其相鄰小區(qū)的中心距離最小,便于實(shí)現(xiàn)跟蹤交換;其覆蓋面積最大,對于同樣大小的服務(wù)區(qū)域,采用正六邊形構(gòu)成小區(qū)制所需的小區(qū)數(shù)最少,即所需基站數(shù)最少;所需的頻率個數(shù)最少,頻率利用率高。

          滿足以下兩個條件:一是若干單位無線區(qū)群能彼此鄰接;二是相鄰單位無線區(qū)群中的同頻小區(qū)中心間隔相等。

          6. 什么是多信道共用?有何優(yōu)點(diǎn)?

          多信道共用是指在網(wǎng)內(nèi)的大量用戶共同享有若干無線信道,這與市話用戶共同享有中繼線相類似。相對于獨(dú)立信道方式來說,可以顯著提高信道利用率。

          7. 大容量的移動通信系統(tǒng)采用何種信道選擇方式?有什么優(yōu)缺點(diǎn)?

          專用呼叫信道方式。

          處理一次呼叫過程所需的時間很短,所以設(shè)立一個專用呼叫信道就可以處理成百上千個用戶的呼叫,適用于大容量系統(tǒng)中;由于專門抽出一個信道作呼叫信道,相對而言,減少了通話信道的數(shù)目,因此對小容量系統(tǒng)來說,是不合算的。

          8. 若需設(shè)計一移動通信系統(tǒng),用戶容量要求為 600 戶,每天每個用戶平均呼叫 5 次,每次平均占用信道時間為 60 秒,呼損率要求為 10% ,忙時擊中率為 0.125 ,問需要多少信道才能滿足 600 個用戶的需要?

          A/A 用戶 =600

          A 用戶 =CTK/3600=5*60*0.125=37.5/3600

          A=6.25

          查表得: 9

          9. 話務(wù)量是怎樣定義的?什么是呼損率?呼損率與接通話務(wù)量的關(guān)系如何?

          單位時間( 1 小時)內(nèi)呼叫次數(shù)與每次呼叫的平均占用信道時間之積。

          當(dāng)多個信道共用時,通常總是用戶數(shù)大于信道數(shù),當(dāng)多個用戶同時要求服務(wù)而信道數(shù)不夠時,只能讓一部分用戶先通話,另一部分用戶等信道空閑時在通話。后一部分用戶因無空閑信道而不能通話,即為呼叫失敗,簡稱呼損。在一個通信系統(tǒng)中,造成呼叫失敗的概率稱為呼叫損失概率,簡稱呼損率。

          呼損率為呼叫失敗的次數(shù)與總呼叫次數(shù)之百分比。

          10.????????????? 愛爾蘭呼損表應(yīng)用的條件是什么?已知 A 用戶 =0.02Erl/ 用戶,如果要求呼損率為 10% ,現(xiàn)有 70 個用戶,需共用的頻道數(shù)為多少?如果 920 個用戶共用 18 個頻道,那么呼損率是多少?

          每次呼叫相對獨(dú)立,互不相關(guān),即呼叫具有隨機(jī)性,也就是說,一個用戶要求通話的概率與正在通話的用戶數(shù)無關(guān);每次呼叫在時間上都有相同的概率。

          A/n=70*0.02/n, A=1.4, 查表得 n=4

          A/n=920*0.02/n, A=18.4, 查表得呼損率為 20%

          11.????????????? 如何提高頻率利用

          頻率復(fù)用、頻率協(xié)調(diào)和頻率規(guī)劃

          12.????????????? 系統(tǒng)對移動交換機(jī)有哪些特殊要求?

          用戶數(shù)據(jù)的存儲;用戶位置的登記;尋呼用戶的信令系統(tǒng)識別及處理;越區(qū)頻道轉(zhuǎn)換的處理;過荷控制;遠(yuǎn)距離檔案存取;路由的控制等。

          13.????????????? 什么是位置登記、一齊呼叫、越區(qū)切換、漫游?

          位置登記是指移動臺向基站發(fā)送報文,表明自己所處的位置的過程。

          若位置信息表明被呼移動用戶在某個位置區(qū),但不知其所處的具體小區(qū),因此,位置區(qū)內(nèi)所有基站一齊呼出被呼移動用戶識別碼,被叫移動用戶應(yīng)答后,即由應(yīng)答小區(qū)提供接續(xù)服務(wù),系統(tǒng)的這種功能稱為“一齊呼叫”。

          為了保證通信的連續(xù)性,正在通話的移動臺從一個小區(qū)進(jìn)入相鄰的另一小區(qū)時,工作頻道從一個無限頻道上轉(zhuǎn)換到另一個無限頻道上,而通話不中斷,這就是越區(qū)切換。

          在聯(lián)網(wǎng)的移動通信系統(tǒng)中,移動臺從一個 MSC 區(qū)到另一個 MSC 區(qū)后,仍能入網(wǎng)使用的通信服務(wù)功能稱為漫游。

          posted @ 2007-01-12 18:51 SYBIL@BLOGJAVA 閱讀(1454) | 評論 (0)編輯 收藏

          junt 4&static import

          JUnit 4:
          http://www.ibm.com/developerworks/cn/java/j-junit4.html

          逐漸挖掘Static Import
          更簡單的訪問靜態(tài)成員
          http://blog.csdn.net/avius/archive/2004/08/27/86744.aspx

          posted @ 2007-01-09 18:02 SYBIL@BLOGJAVA 閱讀(272) | 評論 (0)編輯 收藏

          說說希望……

          ??? 《妙手人心3》,廖碧兒和一腦科醫(yī)生剛剛做醫(yī)生,看到急癥室一病人無論如何也搶救不過來,一陣唏噓……林保儀走過去,問他們做醫(yī)生是為了什么?兩個小醫(yī)生說是救死扶傷……林否定,說人的生命不是醫(yī)生能夠掌握的,你們不必耿耿于懷。隨后,兩人問林,那你為什么要做醫(yī)生?林答:希望,給病人希望……
          ??? 另:……這個省略號以前一直不知道是怎么打出來的,剛看韓寒的blog有說,終于學(xué)會了!原來他也不會,哈哈……再也不用。。。。。。了
          ??? 記住了是謝夫特加6哦^^

          posted @ 2007-01-06 23:54 SYBIL@BLOGJAVA 閱讀(273) | 評論 (1)編輯 收藏

          JUnit使用經(jīng)驗(yàn)(1)(2)(3)

          http://www.z6688.com/info/27393-1.htm

          http://www.z6688.com/info/27394-1.htm

          http://www.z6688.com/info/27392-1.htm

          比較有用的是測試執(zhí)行順序那鍋和不必寫捕獲異常的那鍋。

          posted @ 2007-01-05 17:01 SYBIL@BLOGJAVA 閱讀(876) | 評論 (1)編輯 收藏

          links read 1.3

          Ubuntu這個詞怎么讀?
          http://zhidao.baidu.com/question/5236768.html?si=3

          posted @ 2007-01-03 20:53 SYBIL@BLOGJAVA 閱讀(201) | 評論 (0)編輯 收藏

          Blog links

          什么是3G通信?
          http://zhidao.baidu.com/question/14085848.html?si=5


          http://zhidao.baidu.com/question/11419446.html?md=3

          posted @ 2006-12-25 14:48 SYBIL@BLOGJAVA 閱讀(200) | 評論 (0)編輯 收藏

          很笨。。。。的自動化測試。。。。

          找到頁面,有效,登陸,點(diǎn)一個鏈接
          找到頁面,有效,登陸,點(diǎn)一個鏈接
          找到頁面,有效,登陸,點(diǎn)一個鏈接

          posted @ 2006-12-22 17:46 SYBIL@BLOGJAVA 閱讀(159) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 松滋市| 龙南县| 光泽县| 恩平市| 平邑县| 永康市| 大渡口区| 澜沧| 永丰县| 文登市| 安远县| 桃江县| 田阳县| 沂源县| 南城县| 静安区| 南开区| 东乡族自治县| 长沙县| 哈尔滨市| 洪洞县| 广汉市| 德兴市| 离岛区| 独山县| 晋城| 乌兰县| 平和县| 贵定县| 临江市| 华容县| 丰台区| 密山市| 阳山县| 中卫市| 大兴区| 板桥市| 新疆| 济源市| 黔江区| 揭西县|