根據 時區 計算出 指定時間 在 該時區的 時間
執行緒
目錄
#建立執行緒的方式
- 方法一
extends Thread
- 方法二
implements Runnable
- 方法三
implements Callable<T>
-
方法三
執行緒池
Executors.newFixedThreadPool();
Executors.newSingleThreadExecutor();
Executors.newCachedThreadPool();
Executors.newScheduledThreadPool();
一般需要手動建立執行緒池
ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler)
引數說明
-
coolPoolSize
核心執行緒數當前執行緒池中空閒的執行緒數, 執行時該執行緒始終不會被銷燬, 要小於
maximumCoreSize
-
maximumCoreSize
執行緒池能建立的最大執行緒, 當
WorkQueue
的佇列儲存的任務滿了, 且當前正在執行的執行緒數小於
maximumCorseSize
時, 就會建立一個執行緒來執行不在WorkQueue
中的任務, 一般設定為一般設定為比
Runtime.getRuntime().availableProcessors()
大1或2 -
keepAliveTime
如果當前執行緒數大於
corePoolSize
時且有執行緒空閒時間大於keepAliveTime
corePoolSize
-
unit
keepAliveTime
的時間單位 -
workQueue
阻塞佇列一般採用
LinkedBlockingQueue
, 預設是無邊界的, 必須要指定大小 -
threadFactory
用於自定義執行緒的名字
-
handler
拒絕策略, 噹噹正在執行的執行緒等於
maximumPoolSize
且大於workQueue
佇列滿了,就會採取handler
-
new ThreadPoolExecutor.AbortPolicy()
執行緒池預設採用該模式handler
如果任務數超出佇列與最大執行緒數的值時丟擲異常
-
new ThreadPoolExecutor.DiscardPolicy()
拋棄溢位的任務
-
new ThreadPoolExecutor.DiscardOldestPolicy()
執行緒滿了且超過阻塞佇列容乃,移除佇列頭,將新任務放入佇列末尾
-
#執行緒的狀態
NEW
, RUNNABLE
, BLOCKED
, WAITING
, TIMED_WAITING
, TERMINATED
#終止執行緒的方式
-
semaphore
訊號量,標誌位 -
stop()
過時, 有可能造成死鎖 -
interrupt()
, 通過isInterrupted()
判斷
#volatile
-
可見性
保證了當資料重新寫回主存時資料,所有執行緒可見
-
有序性 (寫在讀之前)
對一個volatile域的寫,happens-before於後續對這個volatile域的讀
-
原子性 !!!注意volatile不具有原子性
保證操作不分隔
例如:
i++ 不具備原子性
分為三步
-
從主存中讀取i
-
i+1
-
將資料寫回主存
所以操作++時要上鎖或是使用
Atomic
相關類, 凡是讀寫操作都不具有原子性 -
#ThreadLocal
每個執行緒中都有一個自己的 ThreadLocalMap 類物件,可以將執行緒自己的物件保持到其中,
各管各的,執行緒可以正確的訪問到自己的物件。