程序員小秘境 2021-09-18 05:44:46 阅读数:956
編寫一個程序,開啟 3 個線程,這三個線程的 ID 分別為 A、B、C,每個線程將自己的 ID 在屏幕上打印 10 遍,要 求輸出的結果必須按順序顯示。 如:ABCABCABC…… 依次遞歸
ReadWriteLock是一個接口
ReadWriteLock 維護了一對相關的鎖,一個用於只讀操作, 另一個用於寫入操作。只要沒有 writer,讀取鎖可以由?多個 reader?線程同時保持。寫入鎖是獨占的
ReadWriteLock 讀取操作通常不會改變共享資源,但執行 寫入操作時,必須獨占方式來獲取鎖。?對於讀取操作占 多數的數據結構。ReadWriteLock 能提供比獨占鎖更高 的並發性。而對於只讀的數據結構,其中包含的不變性 可以完全不需要考慮加鎖操作
靜態同步方法與非靜態同步方法之間是不會有競態條件的,非靜態同步方法,看他們的鎖是不是同一個number,是同一個number則,一個拿到,另一個要等待;否則,另一個不用等待
第四種獲取線程的方法:線程池,一個 ExecutorService,它使用可能的幾個池線程之 一執行每個提交的任務,通常使用 Executors 工廠方法配置。
線程池可以解决兩個不同問題:由於减少了每個任務調用的開銷,它們通常可以在 執行大量异步任務時提供增强的性能,並且還可以提供綁定和管理資源(包括執行 任務集時使用的線程)的方法。每個 ThreadPoolExecutor 還維護著一些基本的統計數 據,如完成的任務數。
為了便於跨大量上下文使用,此類提供了很多可調整的參數和擴展鉤子 (hook)。但 是,强烈建議程序員使用較為方便的 Executors 工廠方法 :
思路:提前創建好多個線程,放入線程池中,使用時直接獲取,使用完 放回池中。可以避免頻繁創建銷毀、實現重複利用。類似生活中的公共交 通工具。
好處: 1. 提高響應速度(减少了創建新線程的時間)
2.降低資源消耗(重複利用線程池中線程,不需要每次都創建)
3.便於線程管理?corePoolSize:核心池的大小 ,/maximumPoolSize:最大線程數,keepAliveTime:線程沒有任務時最多保持多長時間後會終止 線程池:提供了一個線程隊列,隊列中保存著所有等待狀態的線程,避免了創建於銷毀的額外開銷,提高了響應的速度
java.util.concurrent.Executor :負責線程的使用與調度的根接口 –ExecutorService 子接口:線程池的主要接口,繼承Executor –ThreadPoolExecutor 線程池的實現類 –ScheduledExecutorService 子接口:負責線程的調度,繼承ExecutorService –ScheduledThreadPoolExecutor 繼承ThreadPoolExecutor 實現ScheduledExecutorService
ScheduledExecutorService newScheduledThreadPool() 創建固定大小的線程,可以延遲或定時的執行任務
TimeUnit的用法
Fork/Join 框架:就是在必要的情况下,將一個大任務,進行拆分(fork)成 若幹個小任務(拆到不可再拆時),再將一個個的小任務運算的結果進 行 join 匯總
采用 “工作竊取”模式(work-stealing): 當執行新的任務時它可以將其拆分分成更小的任務執行,並將小任務加 到線程隊列中,然後再從一個隨機線程的隊列中偷一個並把它放在自己的隊 列中
相對於一般的線程池實現,fork/join框架的優勢體現在對其中包含的任務 的處理方式上.在一般的線程池中,如果一個線程正在執行的任務由於某些 原因無法繼續運行,那麼該線程會處於等待狀態。而在fork/join框架實現中, 如果某個子問題由於等待另外一個子問題的完成而無法繼續運行。那麼處理 該子問題的線程會主動尋找其他尚未運行的子問題來執行.這種方式减少了 線程的等待時間,提高了性能
Stream API 可以聲明性地通過 parallel() 與 sequential() 在並行流與順序流之間進行切換
版权声明:本文为[程序員小秘境]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210918054445741w.html