Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

第37回NDS Java並行処理 今昔物語

Javaの並列・並行処理について、標準ライブラリのユーティリティなどをピックアップして紹介

Related Books

Free with a 30 day trial from Scribd

See all
  • Be the first to comment

第37回NDS Java並行処理 今昔物語

  1. 1. Java 並行処理 今昔物語 NDS37 @civic
  2. 2. 今回話す内容 • Java の並行処理モデルについて • 並行処理・非同期処理実行方法 • スレッドセーフのために
  3. 3. こちらを参考にピックアップ • Java並行・並列・非同期処理 チートシート - Qiita • http://qiita.com/yohhoy/ items/ bc119324d2b69570597b
  4. 4. Javaの並行処理モデル について
  5. 5. 並行処理モデル • スレッドモデル • 共有データ • ロック
  6. 6. concurrent関係 歴史年表
  7. 7. 歴史年表 Version Class/ Package / Syntax Year 1.0 Thread / synchronized `96 1.2 Synchronized Collection `98 ThreadLocal 1.3 Timer `00 5 ConcurrentHashMap `04 Semaphore, Lock … java.util.atomic 7 Fork / Join `11 8 parallelStream `14
  8. 8. 並行処理・非同期処理 実行方法あれこれ
  9. 9. Thread Java 1.0 から。Runnable インターフェースを実装。 Threadの生成、開始、排他制御、同期は自分でやら なければならない。
  10. 10. Thread Thread th = new Thread(new Runnable(){ public void run(){ //このスレッドでの処理 } }); th.start(); //スレッドの実行開始
  11. 11. ちなみにJava8なら Thread th = new Thread(()->{ //このスレッドでの処理 }); th.start(); //スレッドの実行開始
  12. 12. Synchronized Java 1.0 から。Threadでの排他制御。言語として採 用されている。
  13. 13. Synchronized public synchronized void add(){ //メソッド全体 //このメソッドを同時に実行できるのは //1スレッドのみ } ! Object lock = new Object(); synchronized(lock){ //ロックオブジェクト //とブロック // ... }
  14. 14. Timer Java 1.3から。バックグラウンドでの遅延実行。単一のス レッドが割り当てられ、指定時間後または一定間隔にタス クを実行する。 javascriptのsetTimeout, setInterval的な。 単一スレッドで実行するのでタスクの実行に時間がかかる とスレッドを専有し、後続のタスクの実行に影響する。
  15. 15. Timer Timer timer = new Timer(); timer.schedule(new TimerTask(){ public void run(){ // ... } }, 1000, 5000); //1秒後に開始、5秒間隔
  16. 16. Executor Java5から。別スレッドでのタスク実行を ExecutorServiceに登録して実行。ExecutorService はシングルスレッドだったり固定数のスレッドプール だったりできる。 Futureを使うことで、別スレッドでのタスク実行結 果を受け取るのが楽になる。
  17. 17. Executor ExecutorsService es = Executors.newSingleThreadExecutor(); Future<Integer> future = es.submit(new Callable<>(){ // ... return ret; }); ! Integer ret = future.get(5, TimeUnit.SECONDS); //タスクの終了までブロック(最大5秒)
  18. 18. ExecutorsServiceの実装 ExecutorsServiceの実装を取り替えることで、タスク実行 スレッドを変化させることができる。 ! ExecutorsService es = Executors.newFixedThreadPool(3); //3スレッドでタスク消化 ! ExecutorsService es = Executors.newCachedThreadPool(); //必要に応じて新規スレッド生成・廃棄
  19. 19. Fork/Join Java7から。Executorsよりも、細粒度のタスクを実 行する場合にExecutorsよりも高速。 ForkJoinPoolに、RecursiveTask(返り値あり)また はRecursiveAction(返り値なし)を登録して並列に実 行する。 I/O処理中心のタスクよりも、CPU処理中心のタスク を実行する場合に効果的。
  20. 20. Fork/Join compute(){ if (作業.サイズ < しきい値){ return doWork(作業); } else { f1 = fork(分割した作業の前半); f2 = fork(分割した作業の後半); 2つのfork処理がjoinするまで待機 } }
  21. 21. parallelStream Java8から。streamを並列処理する。内部的にFork/ Joinを使っている。
  22. 22. parallelStream int total = IntStream.range(1, 1000) .parallel() .sum(); ! myArraylist.parallelStream().forEach((elm)->{ //各要素の処理 }); ! ※java8 のConsumerインターフェースのラムダ式
  23. 23. スレッドセーフ
 のために
  24. 24. Synchronized Collection Java1.2から。 複数のスレッドで安全にデータを操 作できるCollection ArrayList, HashMapなどは複数のスレッドから触る と意図しないデータ操作になりかねない。
  25. 25. Synchronized Collection List<String> syncList = Collections.synchronizedList(new ArrayList<>()); ! Map<String, Integer> syncMap = Collections.synchronizedMap(new HashMap<>());
  26. 26. ConcurrentHashMap Java5から。 java.util.concurrent.ConcurrentHashMapは、スレッ ドセーフでありながら、 Collections.synchronizedMapよりも高い更新平行 性をサポート。
  27. 27. CopyOnWriteArrayList Java6から。 java.util.concurrent.CopyOnWriteArrayListは、ス レッドセーフ。イテレーションもロックされない。 変更操作のたびに新しいコピーが生成される。変更が ほとんどなくイテレーションが多い操作に有効。
  28. 28. AtomicInteger Java5から。 AtomicInteger、AtomicLongのようなクラスはスレッ ドセーフでロックフリーな変数として使用できる。
  29. 29. AtomicInteger AtomicInteger i = new AtomicInteger(1); i.incrementAndGet(); //i++
  30. 30. シンクロナイザ java5から。マルチスレッドでの同期方法をサポート するためのユーティリティ。 いろいろある。Semaphore, CountDownLatch, CyclicBarrier, Phaser, Exchanger...
  31. 31. CountDownLatch CountDownLatch latch = new CountDownLatch(3); for (int n = 0; n < 3; n++){ Thread th = new Thread(() -> { // ... なんらかの処理 latch.countDown(); }); th.start(); } latch.await(2, TimeUnit.SECONDS); //latchが0になるのを最大2秒wait
  32. 32. Semaphore • 同時実行可能なスレッドを制限
  33. 33. CyclicBarrier • CountDownLatch のように待ち合わせ • 解放後に再利用できる循環式
  34. 34. Exchanger • 2つのスレッド間でデータ交換
  35. 35. まとめ • 並行処理・非同期処理の実行方法 • Thread, Timer, Executor, Fork/Join • 非同期処理のためのユーティリティ • java.util.concurrent • https://github.com/civic/nds-java-concurrent

    Be the first to comment

    Login to see the comments

  • tsubame9590206

    Aug. 13, 2014
  • ohtsuchi

    Aug. 15, 2014
  • matsumana0101

    Apr. 22, 2015
  • TakKuma1

    Jun. 1, 2015
  • NaoyaWatabiki

    Jun. 15, 2015
  • green_air

    Dec. 6, 2015
  • YasuhitoIwakura

    Feb. 29, 2020
  • MasahiroShimomura

    Mar. 8, 2020

Javaの並列・並行処理について、標準ライブラリのユーティリティなどをピックアップして紹介

Views

Total views

3,845

On Slideshare

0

From embeds

0

Number of embeds

1,166

Actions

Downloads

5

Shares

0

Comments

0

Likes

8

×