第一部分 線 程
第1章 線程簡(jiǎn)介 3
1.1 什么是線程 4
1.2 為什么使用多線程 4
1.2.1 與用戶(hù)的更佳交互 4
1.2.2 同步動(dòng)作的模擬 5
1.2.3 利用多處理器 5
1.2.4 等待緩慢I/O操作時(shí)完成其他任務(wù) 5
1.2.5 簡(jiǎn)化對(duì)象模型 6
1.3 不宜采用多線程的場(chǎng)合 7
1.4 Java的內(nèi)置線程支持 7
1.5 易于起步, 難以掌握 7
第2章 一個(gè)簡(jiǎn)單的雙線程實(shí)例 9
2.1 擴(kuò)展java.lang.Thread類(lèi) 10
2.2 覆蓋run()方法 11
2.3 創(chuàng)建新線程 12
2.4 綜合運(yùn)用 13
2.5 小結(jié) 14
第3章 創(chuàng)建和啟動(dò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章 實(shí)現(xiàn)Runnable接口與擴(kuò)展Thread類(lèi) 30
4.1 可視定時(shí)器圖形組件 31
4.2 能擴(kuò)展Thread和JComponent嗎 37
4.3 接口java.lang.Runnable 38
4.4 把Runnable對(duì)象傳遞給Thread的構(gòu)造函數(shù) 38
4.5 修改SecondCounter來(lái)使用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(shí)候掛起 67
5.2.3 不使用淘汰方法實(shí)現(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)先級(jí) 88
6.2 線程優(yōu)先級(jí)常量 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)先級(jí):getPriority() 89
6.4 更改線程的優(yōu)先級(jí):setPriority() 91
6.5 線程狀態(tài) 94
6.6 優(yōu)先級(jí)和規(guī)劃 96
6.7 自愿放棄處理器:Thread.yield() 96
6.8 線程規(guī)劃情形 102
6.8.1 情形一:一個(gè)高優(yōu)先級(jí)線程獨(dú)占處理器 102
6.8.2 情形二:所有高優(yōu)先級(jí)線程獨(dú)占處理器 102
6.8.3 情形三:所有線程均獲得一定的處理器時(shí)間 102
6.9 小結(jié) 103
第7章 并發(fā)訪問(wèn)對(duì)象和變量 104
7.1 易變成員變量修飾符 105
7.2 同步方法修飾符 110
7.2.1 兩個(gè)線程同時(shí)位于一個(gè)對(duì)象的同一個(gè)方法中 110
7.2.2 同一時(shí)刻一個(gè)線程 112
7.2.3 兩個(gè)線程, 兩個(gè)對(duì)象 115
7.2.4 避免對(duì)象的意外崩潰 117
7.2.5 對(duì)象處于不一致?tīng)顟B(tài)時(shí), 推遲對(duì)它的訪問(wèn) 121
7.3 同步語(yǔ)句塊 126
7.3.1 減少持有鎖的時(shí)間 126
7.3.2 鎖定任意對(duì)象, 而非僅僅鎖定當(dāng)前對(duì)象 127
7.3.3 把向量?jī)?nèi)容安全地復(fù)制到數(shù)組 128
7.4 靜態(tài)同步方法 130
7.5 在同步語(yǔ)句中使用類(lèi)級(jí)別鎖 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ā)訪問(wèn) 145
7.9 小結(jié) 145
第8章 線程間通信 147
8.1 線程間通信的必要性 148
8.2 等待/通知機(jī)制 148
8.2.1 最小規(guī)模的等待/通知 148
8.2.2 典型等待/通知 150
8.2.3 運(yùn)用同步方法的等待/通知 151
8.3 用于等待/通知的對(duì)象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 何時(shí)使用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 使用管道在線程間流動(dòng)數(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 何時(shí)不需要invokeAndWait()和invokeLater() 207
9.6 在GUI設(shè)置中使用工作線程的必需性 208
9.7 使用工作線程減輕事件線程的負(fù)擔(dān) 213
9.8 在自定義組件中滾動(dòng)文本 220
9.9 動(dòng)畫(huà)顯示一系列圖像 225
9.10 在JLabel上顯示流逝的時(shí)間 229
9.11 在容器內(nèi)浮動(dòng)組件 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 類(lèi)ThreadViewer 243
10.11 小結(jié) 252
第二部分 技 術(shù)
第11章 自運(yùn)行對(duì)象 255
11.1 簡(jiǎn)單自運(yùn)行類(lèi) 256
11.2 使用內(nèi)部類(lèi)來(lá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 線程池的考慮與開(kāi)銷(xiāo) 278
13.3 泛型線程池:ThreadPool 279
13.4 專(zhuān)門(mén)工作線程池:HttpServer 288
13.4.1 類(lèi)HttpServer 289
13.4.2 類(lèi)HttpWorker 296
13.4.3 服務(wù)文件示例 305
13.4.4 用3個(gè)工作線程運(yùn)行HttpServer 307
13.4.5 用10個(gè)工作線程來(lái)運(yùn)行HttpServer 309
13.5 小結(jié) 310
第14章 等待完全超時(shí) 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()方法忽略中斷和終止請(qǐng)求 327
15.2 關(guān)閉流來(lái)擺脫阻塞狀態(tài) 329
15.2.1 類(lèi)CalcServer與擺脫阻塞的accept() 330
15.2.2 類(lèi)CalcWorker與擺脫阻塞的read() 333
15.2.3 類(lèi)CalcClient 336
15.2.4 運(yùn)行CalcClient的輸出 337
15.3 被中斷時(shí)拋出InterruptedIOException 338
15.3.1 類(lèi)ThreadedInputStream 338
15.3.2 類(lèi)BufferedThreadedInputStream 347
15.4 針對(duì)可中斷I/O使用BufferedThreadedInputStream 349
15.5 小結(jié) 354
第16章 SureStop的運(yùn)用 356
16.1 使用SureStop的原則 357
16.2 SureStop類(lèi) 357
16.3 使用SureStopVerbose的分析 363
16.4 用SureStopDemo演示SureStop的工作方式 369
16.5 小結(jié) 374
第17章 類(lèi)BooleanLock的運(yùn)用 375
17.1 背景 376
17.2 類(lèi)BooleanLock 376
17.3 使用BooleanLock在線程間發(fā)送信號(hào) 380
17.4 避免阻塞于同步 382
17.4.1 SyncBlock 382
17.4.2 InterruptibleSyncBlock 385
17.5 使用TransitionDetector檢測(cè)Value的短暫變化 388
17.6 小結(jié) 394
第18章 先進(jìn)先出(FIFO)隊(duì)列 395
18.1 FIFO隊(duì)列如何工作 396
18.2 用數(shù)組實(shí)現(xiàn)FIFO 397
18.3 用Java的簡(jiǎn)單實(shí)現(xiàn):SimpleObjectFIFO 399
18.4 對(duì)象引用的一個(gè)擴(kuò)展FIFO隊(duì)列:ObjectFIFO 405
18.5 字節(jié)的FIFO隊(duì)列: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
實(shí)例方法 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
實(shí)例方法 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