2016/06/14

[java]CountDownLatchは再利用しない

BLEの非同期処理を、CountDownLatchで同期にしようとしている。
が、1回目はうまく行くのだが、2回目は結果がうまく返らない。
ログを出してみた問頃、同期待ちにならず、するっと抜けている。

 

CountDownLatch (Java Platform SE 6)
カウントはリセットすることができない、とのことだ。
リセットしたい場合はCyclicBarrierを検討しなさいとのこと。

EffectiveJava第2版の項目69を読むと、CyclicBarrierは使用頻度が低いらしい。
理由はわからんが、じゃあCountDownLatchを使うたびにnewすればいいだろう。


ここまでのソースだ。
hirokuma/AndroidTwoSpinners at a869bfa3af06cbdc19a618ca1877fd8efc568632
何かもう、最初のTwoSpinnersの面影がなくなってきつつあるな。。。

CountDownLatchで待ったりカウントダウンしたりさせているのは、この辺
writeだと、ここで待たせて、ここでカウントダウンしている。
readやDescriptorの設定も似たようなものだ。

 

さて、非同期で返ってきた値を同期で参照しようとすると、間にグローバル変数というか、共通で読むことができるメモリがいる。
今のところ、それはBundleを使っている。
何でかというと、元がそういう感じだったからだ。

何だかよくわからないが、便利そうだ。
ただ、よくわからんのでちょっと怖い。。。

JavaなのかAndroidなのか、とにかく、同じようなことをやるのにいろいろ手段があるように感じてしまうのだ。
そして、それはたぶん同じではないので、使い分けがいるのだろうと思う。

が、1パターンを知ってそれで動いてしまうと、そこで立ち止まってしまうのよねぇ。
かといって、全部知ってから実装するなんてのは、まあ無理だ。
そこら辺をどうやって調べるなり、安全性を確保するなりするのかが、わからずに困っているところだな。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。