第一部分 線 程
第1章 線程簡介 3
1.1 什么是線程 4
1.2 為什么使用多線程 4
1.2.1 與用戶的更佳交互 4
1.2.2 同步動作的模擬 5
1.2.3 利用多處理器 5
1.2.4 等待緩慢I/O操作時完成其他任務(wù) 5
1.2.5 簡化對象模型 6
1.3 不宜采用多線程的場合 7
1.4 Java的內(nèi)置線程支持 7
1.5 易于起步, 難以掌握 7
第2章 一個簡單的雙線程實例 9
2.1 擴(kuò)展java.lang.Thread類 10
2.2 覆蓋run()方法 11
2.3 創(chuàng)建新線程 12
2.4 綜合運用 13
2.5 小結(jié) 14
第3章 創(chuàng)建和啟動線程 15
3.1 使用Thread.currentThread() 16
3.2 線程命名:getName()和setName() 18
3.2.1 使用getName() 18
3.2.2 使用setName() 21
3.3 線程構(gòu)造函數(shù) 22
3.4 激活線程:start()和isAlive() 24
3.5 使用Thread.sleep() 26
3.6 小結(jié) 28
第4章 實現(xiàn)Runnable接口與擴(kuò)展Thread類 30
4.1 可視定時器圖形組件 31
4.2 能擴(kuò)展Thread和JComponent嗎 37
4.3 接口java.lang.Runnable 38
4.4 把Runnable對象傳遞給Thread的構(gòu)造函數(shù) 38
4.5 修改SecondCounter來使用Runnable 39
4.6 檢查SecondCounter的準(zhǔn)確性 45
4.7 提高SecondCounter的準(zhǔn)確性 49
4.8 小結(jié) 54
第5章 完美終止線程 55
5.1 中斷線程:interrupt() 56
5.1.1 中斷休眠線程 58
5.1.2 待決中斷 56
5.1.3 使用isInterrupted() 59
5.1.4 使用Thread.interrupted() 60
5.1.5 使用InterruptedException 61
5.2 掛起和恢復(fù)線程執(zhí)行 63
5.2.1 使用淘汰的方法suspend()和resume() 63
5.2.2 在不恰當(dāng)?shù)臅r候掛起 67
5.2.3 不使用淘汰方法實現(xiàn)掛起和恢復(fù) 70
5.3 終止線程 74
5.3.1 使用淘汰的方法stop() 74
5.3.2 取代stop() 76
5.4 stop(). suspend()和resume()的最佳替代 78
5.5 守護(hù)線程 84
5.6 小結(jié) 86
第6章 線程優(yōu)先化 87
6.1 系統(tǒng)線程優(yōu)先級 88
6.2 線程優(yōu)先級常量 89
6.2.1 Thread.MAX_PRIORITY 89
6.2.2 Thread.MIN_PRIORITY 89
6.2.3 Thread.NORM_PRIORITY 89
6.3 判斷當(dāng)前優(yōu)先級:getPriority() 89
6.4 更改線程的優(yōu)先級:setPriority() 91
6.5 線程狀態(tài) 94
6.6 優(yōu)先級和規(guī)劃 96
6.7 自愿放棄處理器:Thread.yield() 96
6.8 線程規(guī)劃情形 102
6.8.1 情形一:一個高優(yōu)先級線程獨占處理器 102
6.8.2 情形二:所有高優(yōu)先級線程獨占處理器 102
6.8.3 情形三:所有線程均獲得一定的處理器時間 102
6.9 小結(jié) 103
第7章 并發(fā)訪問對象和變量 104
7.1 易變成員變量修飾符 105
7.2 同步方法修飾符 110
7.2.1 兩個線程同時位于一個對象的同一個方法中 110
7.2.2 同一時刻一個線程 112
7.2.3 兩個線程, 兩個對象 115
7.2.4 避免對象的意外崩潰 117
7.2.5 對象處于不一致狀態(tài)時, 推遲對它的訪問 121
7.3 同步語句塊 126
7.3.1 減少持有鎖的時間 126
7.3.2 鎖定任意對象, 而非僅僅鎖定當(dāng)前對象 127
7.3.3 把向量內(nèi)容安全地復(fù)制到數(shù)組 128
7.4 靜態(tài)同步方法 130
7.5 在同步語句中使用類級別鎖 134
7.6 同步化和集合API 136
7.6.1 封裝集合, 使之同步化 136
7.6.2 安全地把列表中的內(nèi)容復(fù)制到數(shù)組 137
7.6.3 安全遍歷集合元素 139
7.7 死鎖 141
7.8 加速并發(fā)訪問 145
7.9 小結(jié) 145
第8章 線程間通信 147
8.1 線程間通信的必要性 148
8.2 等待/通知機制 148
8.2.1 最小規(guī)模的等待/通知 148
8.2.2 典型等待/通知 150
8.2.3 運用同步方法的等待/通知 151
8.3 用于等待/通知的對象API 153
8.3.1 notify() 153
8.3.2 notifyAll() 153
8.3.3 wait() 153
8.3.4 wait(long) 154
8.3.5 wait(long, int) 154
8.4 何時使用notifyAll()代替notify() 154
8.5 遺漏通知 155
8.5.1 MissedNotify 155
8.5.2 MissedNotifyFix 159
8.6 早期通知 163
8.6.1 EarlyNotify 164
8.6.2 EarlyNotifyFix 167
8.7 示例CubbyHole 171
8.8 使用join()等待線程的消亡 177
8.8.1 join() 177
8.8.2 join(long) 177
8.8.3 join(long, int) 177
8.8.4 JoinDemo 178
8.9 使用管道在線程間流動數(shù)據(jù) 181
8.9.1 PipedBytes 182
8.9.2 PipedCharacters 185
8.10 使用ThreadLocal和InheritableThreadLocal 188
8.10.1 ThreadLocal API 189
8.10.2 ThreadID 189
8.10.3 InheritableThreadLocal API 192
8.10.4 InheritableThreadID 192
8.11 小結(jié) 198
第9章 線程和Swing 199
9.1 為什么Swing工具包不是多線程安全 200
9.2 使用SwingUtilities.invokeAndWait() 201
9.3 使用SwingUtilities.invokeLater() 204
9.4 使用SwingUtilities.isEventDispatchThread() 207
9.5 何時不需要invokeAndWait()和invokeLater() 207
9.6 在GUI設(shè)置中使用工作線程的必需性 208
9.7 使用工作線程減輕事件線程的負(fù)擔(dān) 213
9.8 在自定義組件中滾動文本 220
9.9 動畫顯示一系列圖像 225
9.10 在JLabel上顯示流逝的時間 229
9.11 在容器內(nèi)浮動組件 233
9.12 小結(jié) 238
第10章 線程組 239
10.1 什么是線程組 240
10.2 使用getParent() 241
10.3 查找線程組的子組 241
10.4 使用Thread的getThreadGroup()方法 242
10.5 查找線程組中的所有線程 242
10.6 理解線程組的安全性 242
10.7 使用setMaxPriority()和getMaxPriority() 243
10.8 使用interrupt() 243
10.9 淘汰的方法:stop(). suspend()和resume() 243
10.10 類ThreadViewer 243
10.11 小結(jié) 252
第二部分 技 術(shù)
第11章 自運行對象 255
11.1 簡單自運行類 256
11.2 使用內(nèi)部類來隱藏run() 259
11.3 要考慮的額外功能 261
11.4 小結(jié) 267
第12章 異?;卣{(diào) 268
12.1 ExceptionListener接口 269
12.2 支持ExceptionListener的輔助方法 269
12.3 小結(jié) 276
第13章 線程池 277
13.1 線程池的好處 278
13.2 線程池的考慮與開銷 278
13.3 泛型線程池:ThreadPool 279
13.4 專門工作線程池:HttpServer 288
13.4.1 類HttpServer 289
13.4.2 類HttpWorker 296
13.4.3 服務(wù)文件示例 305
13.4.4 用3個工作線程運行HttpServer 307
13.4.5 用10個工作線程來運行HttpServer 309
13.5 小結(jié) 310
第14章 等待完全超時 311
14.1 意外提前返回 312
14.2 判斷是否應(yīng)當(dāng)再次調(diào)用wait() 315
14.3 通用等待-直到模式 319
14.4 小結(jié) 325
第15章 擺脫阻塞I/O狀態(tài)的束縛 326
15.1 read()方法忽略中斷和終止請求 327
15.2 關(guān)閉流來擺脫阻塞狀態(tài) 329
15.2.1 類CalcServer與擺脫阻塞的accept() 330
15.2.2 類CalcWorker與擺脫阻塞的read() 333
15.2.3 類CalcClient 336
15.2.4 運行CalcClient的輸出 337
15.3 被中斷時拋出InterruptedIOException 338
15.3.1 類ThreadedInputStream 338
15.3.2 類BufferedThreadedInputStream 347
15.4 針對可中斷I/O使用BufferedThreadedInputStream 349
15.5 小結(jié) 354
第16章 SureStop的運用 356
16.1 使用SureStop的原則 357
16.2 SureStop類 357
16.3 使用SureStopVerbose的分析 363
16.4 用SureStopDemo演示SureStop的工作方式 369
16.5 小結(jié) 374
第17章 類BooleanLock的運用 375
17.1 背景 376
17.2 類BooleanLock 376
17.3 使用BooleanLock在線程間發(fā)送信號 380
17.4 避免阻塞于同步 382
17.4.1 SyncBlock 382
17.4.2 InterruptibleSyncBlock 385
17.5 使用TransitionDetector檢測Value的短暫變化 388
17.6 小結(jié) 394
第18章 先進(jìn)先出(FIFO)隊列 395
18.1 FIFO隊列如何工作 396
18.2 用數(shù)組實現(xiàn)FIFO 397
18.3 用Java的簡單實現(xiàn):SimpleObjectFIFO 399
18.4 對象引用的一個擴(kuò)展FIFO隊列:ObjectFIFO 405
18.5 字節(jié)的FIFO隊列:ByteFIFO 419
18.6 小結(jié) 432
第三部分 附 錄
附錄A Thread API 435
成員變量 436
Thread.MAX_PRIORITY 436
Thread.MIN_PRIORITY 436
Thread.NORM_PRIORITY 436
構(gòu)造函數(shù) 437
Thread(ThreadGroup, Runnable, String) 437
Thread(ThreadGroup, Runnable) 437
Thread(ThreadGroup, String) 437
Thread(Runnable, String) 437
Thread(Runnable) 438
Thread(String) 438
Thread() 438
靜態(tài)方法 438
Thread.activeCount() 438
Thread.currentThread() 438
Thread.dumpStack() 438
Thread.enumerate() 439
Thread.interrupted() 439
Thread.sleep(long) 439
Thread.sleep(long, int) 439
Thread.yield() 439
實例方法 440
checkAccess() 440
destroy() 440
getContextClassLoader() 440
getName() 440
getPriority() 440
getThreadGroup() 440
interrupt() 441
isAlive() 441
isDaemon() 441
isInterrupted() 441
join() 441
join(long) 441
join(long, int) 442
run() 442
setContextClassLoader(ClassLoader) 442
setDaemon(boolean) 442
setName(String) 442
setPriority(int) 443
start() 443
toString() 443
被淘汰的方法 443
countStackFrames() 443
resume() 443
stop() 444
stop(Throwable) 444
suspend() 444
附錄B ThreadGroup API 445
構(gòu)造函數(shù) 446
ThreadGroup(ThreadGroup, String) 446
ThreadGroup(String) 446
實例方法 447
activeCount() 447
activeGroupCount() 447
checkAccess() 447
destroy() 447
enumerate(Thread[], boolean) 447
enumerate(Thread[]) 448
enumerate(ThreadGroup[], boolean) 448
enumerate(ThreadGroup[]) 448
getMaxPriority() 448
getName() 448
getParent() 448
interrupt() 449
isDaemon() 449
isDestroyed() 449
list() 449
parentOf(ThreadGroup) 449
setDaemon(boolean) 449
setMaxPriority(int) 449
toString() 450
uncaughtException(Thread, Throwable) 450
被淘汰的方法 450
allowThreadSuspension(boolean) 450
resume() 450
stop() 450
suspend() 451
索引 452