想參加多人運動?並行流(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++
- 資料分析師想收入翻倍,不懂點時間管理怎麼行
- 空間、運動(時間)以及程式設計師程式設計師
- 趙成的運維體系管理課-趙成-極客時間運維
- 強大的Stream並行流並行
- Git | Git入門,成為專案管理大師(一)Git專案管理
- 成為Flutter動畫大師(三)Flutter動畫
- 成為Flutter動畫大師(二)Flutter動畫
- 成為Flutter動畫大師(一)Flutter動畫
- 讓免費OA系統做你的時間管理大師
- 8個“時間管理黑客”教你更好利用時間獲得成功黑客
- 教你如何成為Oracle 10g OCP - 第七章 undo表空間管理Oracle 10g
- 為啥程式設計師工資高,卻很多人想轉行,這4點原很現實程式設計師
- PostgreSQL官方並行更新時間表SQL並行
- 超越datetime:Arrow,Python中的日期時間管理大師Python
- SDUST OJ 時間類的加、減法賦值運算賦值
- golang 時間加減Golang
- java時間加減Java
- ORACLE時間加減Oracle
- golang gin框架進行時間運算之解決orm時間與時間運算——附原始碼Golang框架ORM原始碼
- 教你如何成為Oracle 10g OCP - 第十五章 自動化管理Oracle 10g
- 程式設計師工資高,卻有很多人想轉行,理由很簡單!程式設計師
- 新夢想幹貨——學會高效管理時間,健康工作
- MySQL並行複製延時時間不準確MySql並行
- 智慧城市成為受害者只是時間問題 採取行動應從現在做起
- 成為行動上的巨人
- 策略遊戲如何成為“時間殺手”遊戲
- 何時出現電子版的《黑客與畫家》——參加移動開發者大會的思考黑客移動開發
- 9歲女孩成為蘋果開發者大會最小參會者蘋果
- JS設定時間格式為2010-01-01,以及時間加減JS
- 時間轉換成時間戳時間戳
- 天獅集團將成為未來大健康行業的全球化參與者行業
- 轉職成為TypeScript程式設計師的參考手冊TypeScript程式設計師
- 教你成為全棧工程師(FullStackDeveloper)〇-什麼是全棧工程師全棧工程師Developer
- GitHub如何運作:時間並不決定一切Github
- 如何成為偉大的程式設計師?程式設計師
- 僅用一年時間,位元組跳動成為了休閒遊戲發行TOP1遊戲
- 處理海量資料的模式MapReduce,大規模資料集的並行運算模式並行