CUBは子供の白熊

Java SE 8 実践プログラミングの練習問題を解く

並行プログラミング

第6章 並行処理の機能強化 : 問題 11 : タスクを非同期に繰り返す

問題 次のメソッドを作成せよ public static <T> CompletableFuture<T> repeat(Supplier<T> action, Predicate<T> until) このメソッドはuntil関数が受け入れる値を生成するまでactionを非同期に繰り返す そして、until関数も非同期に実行する 解答 public static <T> Compl</t></t></t></t></t>…

第6章 並行処理の機能強化 : 問題 10 : CompletableFuture の合成

問題 ユーザーにURLを問い合わせて、そのURLのWebページを読み込み、全てのリンクを表示するプログラムを作成せよ 各ステップでCompletableFutureを使用せよ CompletableFutureのgetメソッドを呼び出さないこと 準備 各ステップの処理を(Futureを使わないで…

“第3章 問題 15 : 画像変換の並列化” リベンジ

エピソード IV - 新たなる希望 画像変換の遅延評価を並列化する第3章の問題15 で synchronizedを入れただけで、私のマシンでは20%遅くなった 私のマシンのコア数は4つなので、並列化しても挽回ならず結局遅くなってしまった(残念…) と書いたが、何も考えず…

第6章 並行処理の機能強化 : 問題 9 : フィボナッチ数の計算を並列化

問題 ひとつ前のブログを参照してくださいと言いたいとこだけど、一応書いときますか… フィボナッチ数の計算を並列化するためにArrays.parallelPrefixメソッドを使え n 番目のフィボナッチ数は F = | 1 1 | | 1 0 | とした場合の F の n 乗の計算結果の左上…

第6章 並行処理の機能強化 : 問題 9 : フィボナッチ数の計算を並列化

問題 フィボナッチ数の計算を並列化するためにArrays.parallelPrefixメソッドを使え n 番目のフィボナッチ数は とした場合の の計算結果の の値である 注意 Markdown 記法のバグなのか、この後に Java のコードを書くと、せっかく TeX を使って書いた行列式…

第6章 並行処理の機能強化 : 問題 8 : parallelSort と sort

問題 あなたのコンピュータではArrays.parallelSortは、配列のサイズがどのくらいになればArrays.sortより速くなるか? 解答 Arrays.parallelSortはサイズが 8K 以下のときはマルチで動作しない そこで 8K から始めて 1K づつサイズを増やして計測してみる ■ …

第6章 並行処理の機能強化 : 問題 7 : ConcurrentHashMap の reduce メソッド

問題 ConcurrentHashMap<String, Long>内で、最大値を持つキーを見つけよ 同じ Long 値であれば、どのキーであっても構わない 準備 戦争と平和の単語(57万5343語)の出現回数のマップを使う ただし、3文字以下の単語は切り捨てる(でないと the が圧倒的だもんね) ■ 単語</string,>…

第6章 並行処理の機能強化 : 問題 6 : ConcurrentHashMap の computeIfAbsent メソッド

問題 複数スレッドが複数のファイルから全ての単語を読み込むアプリケーションを書け 各々の単語がどのファイルで使用されていたかを管理するためにConcurrentHashMap<String,Set<File>>とcomputeIfAbsentメソッドを使用せよ 準備 読み込むテキストファイルは問題 5 と同じ5つ</string,set<file>…

第6章 並行処理の機能強化 : 問題 5 : ConcurrentHashMap の merge メソッド

問題 複数スレッドが複数のファイルから全ての単語を読み込むアプリケーションを書け 各々の単語がどのファイルで使用されていたかを管理するためにConcurrentHashMap<String,Set<File>>とmergeメソッドを使用せよ 準備 テキストファイルから単語を順次読み込む Reader を定義</string,set<file>…

第6章 並行処理の機能強化 : 問題 4 : LongAccumulator

問題 LongAccumulatorを使用して、要素の最大値あるいは最小値を計算せよ 解答 1000万個の配列を用意して、最大値を求めてみる ■ 準備 long[] values = new long[1000_0000]; for (int i = 0; i < values.length; i++) { values[i] = (long)(1000_0000 * Mat…

第6章 並行処理の機能強化 : 問題 3 : AtomicLong と LongAdder

問題 1,000個のスレッドを生成し、各スレッドは、ある一つのカウンターを100,000回インクリメントする AtomicLong と LongAdder を使用した場合の性能を比較せよ 解答 ■ AtomicLong final int TASK = 1000; final int COUNT = 100_000; AtomicLong globalCou…

第6章 並行処理の機能強化 : 問題 2 : LongAdder

問題 増加する ID 列を生成するためにLongAdderは役に立つか? その答えの理由を述べよ 解答 LongAdderは、正しい値を取得できないので役に立たない まずLongAdderのincrementメソッドは、現在の値を返さない ■ 計算系のメソッド void increment() void add(l…

第6章 並行処理の機能強化 : 問題 1 : AtomicReference

問題 多数のスレッドが更新する最大長の文字列を管理するプログラムを書け 解答 単語の一覧は、第2章で出てきた戦争と平和(war-and-peace.txt)を使う ■ 単語一覧の取得 … 単語数 = 575,343 String[] words; String contents = new String( Files.readAllBy…

第6章 並行処理の機能強化

Java が登場した当時は ロックで同期をとる機能が、ライブラリではなく言語レベルでサポートされている ことが画期的だった プログラマはsynchronizedを拍手でもって迎えたが、それによって並行プログラミングの難しさが軽減された訳ではなかった ただ、Java…

第3章 ラムダ式を使ったプログラミング : 問題 15 : 画像変換の並列化

問題 LatentImageクラスに操作の並列化機能を追加せよ 解答 LatentImageクラスの Nested Class であるTransformedPixelReaderはスレッドセーフではないので、スレッドセーフな派生クラスを定義する まずTransformedPixelReaderのフィールドを全てprivateから…

第3章 ラムダ式を使ったプログラミング : 問題 2 : ReentrantLock

問題 2 java.util.concurrent.locksのReentrantLockを使用する場合には、次のイデオムでロックとアンロックをする必要がある。 myLock.lock(); try { 何らかの処理 } finally { myLock.unlock(); } 次のように呼び出すことができるwithLockメソッドを提供せ…

第2章 ストリーム API の使い方 : 問題 12, 13 : 並列ストリーム

問題 12 短い単語の数をカウントする処理 Stream<String> words = ~; int[] shortWords = new int[12]; words.parallel() .forEach(s -> { if (s.length() < 12) shortWords[s.length()]++; }); は、競合が起こり正しくカウントできない。 shortWordsをAtomicIntege</string>…

第2章 ストリーム API の使い方 : 問題 1 : ストリーム API を使わないで並列処理

問題 1 長い単語を数える処理を以下のようにforループで行った List<String> words = 〜; int count = 0; for (String w : words) { if (w.length() > 12) count++; } これの並列バージョンを書け 解答 ストリーム API を使えば、ものすごく簡単に書けるのに… まあ挑</string>…