總結
何時使用多線程技術
以及何時避免用它
這是我們需要掌握的重要課題
它的主要目的是對大量任務進行有序的管理
通過多個任務的混合使用
可以更有效地利用計算機資源
或者對用戶來說顯得更方便
資源均衡的經典問題是在IO等候期間如何利用CPU
至於用戶方面的方便性
最經典的問題就是如何在一個長時間的下載過程中監視並靈敏地反應一個
停止
(stop)按鈕的按下
多線程的主要缺點包括
(
) 等候使用共享資源時造成程序的運行速度變慢
(
) 對線程進行管理要求的額外CPU開銷
(
) 復雜程度無意義的加大
比如用獨立的線程來更新數組內每個元素的愚蠢主意
(
) 漫長的等待
浪費精力的資源競爭以及死鎖等多線程症狀
線程另一個優點是它們用
輕度
執行切換(
條指令的順序)取代了
重度
進程場景切換(
條指令)
由於一個進程內的所有線程共享相同的內存空間
所以
輕度
場景切換只改變程序的執行和本地變量
而在
重度
場景切換時
一個進程的改變要求必須完整地交換內存空間
線程處理看來好象進入了一個全新的領域
似乎要求我們學習一種全新的程序設計語言——或者至少學習一系列新的語言概念
由於大多數微機操作系統都提供了對線程的支持
所以程序設計語言或者庫裡也出現了對線程的擴展
不管在什麼情況下
涉及線程的程序設計
(
) 剛開始會讓人摸不著頭腦
要求改換我們傳統的編程思路
(
) 其他語言對線程的支持看來是類似的
所以一旦掌握了線程的概念
在其他環境也不會有太大的困難
盡管對線程的支持使Java語言的復雜程度多少有些增加
但請不要責怪Java
畢竟
利用線程可以做許多有益的事情
多個線程可能共享同一個資源(比如一個對象裡的內存)
這是運用線程時面臨的最大的一個麻煩
必須保證多個線程不會同時試圖讀取和修改那個資源
這要求技巧性地運用synchronized(同步)關鍵字
它是一個有用的工具
但必須真正掌握它
因為假若操作不當
極易出現死鎖
除此以外
運用線程時還要注意一個非常特殊的問題
由於根據Java的設計
它允許我們根據需要創建任意數量的線程——至少理論上如此(例如
假設為一項工程方面的有限元素分析創建數以百萬的線程
這對Java來說並非實際)
然而
我們一般都要控制自己創建的線程數量的上限
因為在某些情況下
大量線程會將場面變得一團糟
所以工作都會幾乎陷於停頓
臨界點並不象對象那樣可以達到幾千個
而是在
以下
一般情況下
我們只創建少數幾個關鍵線程
用它們解決某個特定的問題
這時數量的限制問題不大
但在較常規的一些設計中
這一限制確實會使我們感到束手束腳
大家要注意線程處理中一個不是十分直觀的問題
由於采用了線程
調度
機制
所以通過在run()的主循環中插入對sleep()的調用
一般都可以使自己的程序運行得更快一些
這使它對編程技巧的要求非常高
特別是在更長的延遲似乎反而能提高性能的時候
當然
之所以會出現這種情況
是由於在正在運行的線程准備進入
休眠
狀態之前
較短的延遲可能造成
sleep()結束
調度機制的中斷
這便強迫調度機制將其中止
並於稍後重新啟動
以便它能做完自己的事情
再進入休眠狀態
必須多想一想
才能意識到事情真正的麻煩程度
本章遺漏的一件事情是一個動畫例子
這是目前程序片最流行的一種應用
然而
Java JDK配套提供了解決這個問題的一整套方案(並可播放聲音)
大家可到的演示區域下載
此外
我們完全有理由相信未來版本的Java會提供更好的動畫支持——盡管目前的Web湧現出了與傳統方式完全不同的非Java
非程序化的許多動畫方案
如果想系統學習Java動畫的工作原理
可參考《Core Java——核心Java》一書
由Cornell&Horstmann編著
Prentice
Hall於
年出版
若欲更深入地了解線程處理
請參考《Concurrent Programming in Java——Java中的並發編程》
由Doug Lea編著
Addison
Wiseley於
年出版
或者《Java Threads——Java線程》
Oaks&Wong編著
O
Reilly於
年出版
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27310.html