concurrent包是常用多線程的相關包,最近由於開發sdn程序,對於多線程使用比以前多了很多,現簡單總結下。
第一類 原子類:用在多個線程共同操作一個計數的情況
AtomicLong
AtomicInteger
第二類 lock和condition
condition是從lock中得到的,所以在使用時,在執行了lock.lock()后才進行condition的操作,condition常用的兩個方法await和signal。
常用在多個線程操作一個共同的資源,一個線程執行結束后,另一個線程才能執行的情況。
另外,lock應該代替以前的synchronized關鍵字。synchronized屬於jvm層面的同步策略,由jvm進行鎖的分配和釋放。但是據說高並發量時,需要頻繁切換線程棧,性能不好。
從今以后,代碼中應該使用lock實現同步。
第三類 多線程任務執行ExecutorService
這部分大體上涉及到三個概念,
Callable 被執行的任務
Executor 執行任務()
Future 異步提交任務的返回數據 FutureTask為具體實現
線程資源是系統很珍貴的資源,的確不應該由程序員隨意的new Thread方式,自己啟動線程。如果項目上有自己的框架,應該使用項目框架中的線程工具,如果沒有最好使用jdk提供的ExecutorService工具類。
常見的線程池
- ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); -- 超時會銷毀池中的線程
- ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); -- 線程池中的線程即使空閑也不銷毀
- ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();
- ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3); -- 能夠定時執行任務的線程池,比如可以用在數據采集功能,每隔一小時執行一次
第四類 工具類
比如 CyclicBarrier, CountDownLatch 用來協調多個線程,執行順序的
第五類 線程安全的集合類 比如BlockingQueue ConcurrentMap