想參加多人運動?並行流(ParallelStream)模式教你成為時間管理大師
目的
提高程式執行效率, 減少響應時間或者增加吞吐量
例子程式碼
最近羅*祥, 福報廠P12 jf 引起了大家的關注, 二位都是因為私人生活問題, 搞的微博程式設計師天天加班加伺服器, 讓我等吃了一個又一個瓜, 真是犯了全天下男人都會犯的錯, 我感覺我就不會犯這種錯, 當然是因為我是個好男人主要是因為沒錢, 沒名, 身體也…
行了行了, 說遠了, 我們還是可以從他們身上學習到這個時間管理大法的, 從而可以有時間多參加 ‘多人運動’
我們假設有這麼一個 ‘太虛公子’ 這個一個壞男孩, 要和三位女孩一起玩(shui)耍(jiao)
壞男孩類:
@Data
@AllArgsConstructor
public class BadBoy {
private String name;
public void playWithGirls(List<Girl> girls) {
for (Girl girl : girls) {
girl.playWithBody(this);
}
}
}
女孩類:
@Data
@AllArgsConstructor
public class Girl {
private String name;
@SneakyThrows
void playWithBody(BadBoy badBoy) {
System.out.println(name + "開始和" + badBoy.getName() + "玩");
doSomethingMySelf();
System.out.println(name + "玩完了");
}
private void doSomethingMySelf() throws InterruptedException {
//'睡覺' 1 秒完事
Thread.sleep(500);
System.out.println(name + "自己吃飯, 化妝, 發微博");
Thread.sleep(500);
}
}
我們讓 ‘太虛公子’ 與三位女孩玩耍:
StopWatch stopwatch = StopWatch.createStarted();
BadBoy lzx = new BadBoy("空虛公子");
lzx.playWithGirls(List.of(new Girl("周*青"), new Girl("花花董花花"), new Girl("張大*")));
stopwatch.stop();
System.out.println("total time: " + stopwatch.getTime(TimeUnit.SECONDS));
我們看下輸出和總耗時:
周*青開始和 空虛公子玩
周*青自己吃飯, 化妝, 發微博
周*青玩完了
花花董花花開始和 空虛公子玩
花花董花花自己吃飯, 化妝, 發微博
花花董花花玩完了
張大*開始和 空虛公子玩
張大*自己吃飯, 化妝, 發微博
張大*玩完了
total time: 3
問題分析
就是時間管理不太好, 三個女孩需要三秒, 那不是太慢了, 能不能三個女孩就花一秒多的時間就能行呢
並行流模式
我們定義一個時間管理大師壞男孩:
@Data
@AllArgsConstructor
public class ParallelBadBoy {
private String name;
public void playWithGirls(List<Girl> girls) {
girls.parallelStream().forEach(girl -> girl.playWithBody(this));
}
}
Girl 增加一個與時間管理大師玩的多型方法:
@Data
@AllArgsConstructor
public class Girl {
private String name;
@SneakyThrows
void playWithBody(BadBoy badBoy) {
System.out.println(name + "開始和" + badBoy.getName() + "玩");
doSomethingMySelf();
System.out.println(name + "玩完了");
}
@SneakyThrows
void playWithBody(ParallelBadBoy badBoy) {
System.out.println(name + "開始和" + badBoy.getName() + "玩");
doSomethingMySelf();
System.out.println(name + "玩完了");
}
private void doSomethingMySelf() throws InterruptedException {
//'睡覺' 1 秒完事
Thread.sleep(500);
System.out.println(name + "自己吃飯, 化妝, 發微博");
Thread.sleep(500);
}
}
呼叫:
StopWatch stopwatch = StopWatch.createStarted();
ParallelBadBoy lzx = new ParallelBadBoy("八爪魚");
lzx.playWithGirls(List.of(new Girl("周*青"), new Girl("花花董花花"), new Girl("張大*")));
stopwatch.stop();
System.out.println("total time: " + stopwatch.getTime(TimeUnit.SECONDS));
輸出:
周*青開始和八爪魚玩
花花董花花開始和八爪魚玩
張大*開始和八爪魚玩
花花董花花自己吃飯, 化妝, 發微博
張大*自己吃飯, 化妝, 發微博
周*青自己吃飯, 化妝, 發微博
花花董花花玩完了
張大*玩完了
周*青玩完了
total time: 1
更近非同步
如果不自定義執行緒池, 預設的是一個公有的執行緒池, 壞男孩太多了反而可能比序列還慢
@Data
@AllArgsConstructor
public class ParallelBadBoy {
private static final ForkJoinPool COLUMN_POOL = new ForkJoinPool(30);
private String name;
public void playWithGirls(List<Girl> girls) {
COLUMN_POOL.submit(() -> girls.parallelStream().forEach(girl -> girl.playWithBody(this)));
}
}
課後作業
- 把 BadBoy 和 ParallelBadBody 抽象成一個類
- 思考並行流一定可以加快速度麼
- 瞭解普通執行緒池的技術和並行流執行緒池的區別, 比較二者的優劣, 我們有這麼一個貸款產品需要展示給使用者, 如果需要從多個系統取資料做聚合展示, 比如從 A 系統取期限, 還款方式和可貸額度, 從B 系統取優惠卷列表, C 系統取登入使用者資訊, 這種情況是否適合使用並行流方式
微信:
相關文章
- c++時間管理大師C++
- 資料分析師想收入翻倍,不懂點時間管理怎麼行
- 成為Flutter動畫大師(三)Flutter動畫
- 成為Flutter動畫大師(二)Flutter動畫
- 成為Flutter動畫大師(一)Flutter動畫
- 趙成的運維體系管理課-趙成-極客時間運維
- 強大的Stream並行流並行
- Git | Git入門,成為專案管理大師(一)Git專案管理
- 超越datetime:Arrow,Python中的日期時間管理大師Python
- 夢想加空間:2021年Z世代辦公行為報告(附下載)
- 讓免費OA系統做你的時間管理大師
- 8個“時間管理黑客”教你更好利用時間獲得成功黑客
- PostgreSQL官方並行更新時間表SQL並行
- 從計劃在冬奧會時建立“帶動3億人參加冰雪運動”的目標
- 為啥程式設計師工資高,卻很多人想轉行,這4點原很現實程式設計師
- JS設定時間格式為2010-01-01,以及時間加減JS
- golang 時間加減Golang
- golang gin框架進行時間運算之解決orm時間與時間運算——附原始碼Golang框架ORM原始碼
- MySQL並行複製延時時間不準確MySql並行
- 程式設計師工資高,卻有很多人想轉行,理由很簡單!程式設計師
- 華為雲服務認證首席架構師邀你免費學習課程,參加限時活動領音響!架構
- 智慧城市成為受害者只是時間問題 採取行動應從現在做起
- 新夢想幹貨——學會高效管理時間,健康工作
- 一級建造師如何參加繼續教育?
- 策略遊戲如何成為“時間殺手”遊戲
- Linux 檢視程式啟動時間、執行時間Linux
- 成為行動上的巨人
- LOL2018全年幸運召喚師活動時間表 每個月活動開始結束時間彙總WX
- Java 8 Stream並行流Java並行
- Stream並行流詳解並行
- 總是感覺時間不夠用?程式設計師如何管理時間?程式設計師
- 簡寫readStream的流動模式並完成文章搜尋功能模式
- goroutine的多核並行化,讓出時間片Go並行
- parallelStream中的執行緒安全問題Parallel執行緒
- DolphinScheduler JavaTask動態傳參秘籍:輕鬆實現任務間資料流動Java
- 萬彩動畫大師教程 | 多個元素動畫同時進行動畫
- 時間管理
- 零基礎參加軟體測試培訓需要學多長時間