2011-07-27 6 views
5

私は、スレッドAからスレッドBを削除しようとしたときに(通常、時にはうまくいきました)、私のAndroid Appに未知の理由があってもスレッドロックに問題がありました。自分のメソッドの中には、同期されずにスレッド間で呼び出しを行っていたためだと思いました。私はcancelメソッドと、本質的にイベントハンドラを同期させ、いくつかの共有変数をvolatileにして、すべてがうまくいくようなメソッドを作りました。Javaで同期メソッドを宣言してトレードオフしますか?

私が追加した20の奇数/同期の宣言のうち、実際に問題を解決したことは分かりません。

私の質問は次のとおりです。メソッドの同期化またはプリミティブなvolatileの宣言に関連するトレードオフはありますか?これらの宣言を必要としない場合は避けるべき理由はありますか?

編集
スレッド(S)問題のASyncTaskや他のワーカースレッド型ソリューションがうまく機能しないので、ストリーミングデータを送信/受信しているBluetooth接続です。有限のタスクを実行し、完了すると終了するように設計されています。 ASyncTaskのように、アプリケーションを単に終了させるオーバーヘッドが増えるものもあります。このようなスレッドを継続的に実行するには、スレッドを使用することが最も良い方法です。

私はアンドロイドServiceを使用してスレッドを生成および管理しています。そのため、私はその点でAndroidの設計パラダイムに従っています。

+0

パフォーマンスペナルティが(小さな?)固有のものです。 「スレッドロックでの問題」(非揮発性メンバフィールドをポーリングする)が何であったのかを知るのは難しいですが、デッドロックを得るための良い方法のように 'synchronized'サウンドを自由に追加します。競争条件がない?大きな問題は、スレッド間で共有状態の*ロット*があることです。共有する必要があるものを決定し、共有状態がスレッドセーフであることを確認して(できるだけ不変なヘルプを作成する)、スレッドの通信方法を決定する必要があります(Handler/ConcurrentLinkedQueue/LinkedBlockingQueue?)。 –

答えて

-1

問題が解決しない場合は今すぐ:)、次のプロジェクトではAsyncTaskを使用することを検討してください。 Dev Guide。私はパフォーマンスの影響がAndroidのコンテキストでは本当の懸念ではないと思っていますが、複雑さ、可読性、および将来の保守性が問題になります(スレッドのキャンセル/削除、多くの共有変数)。

+0

私はASyncTaskについて知っていますが、これはBluetooth通信アプリケーションであり、常に実行中のスレッドが必要です。 ASyncTaskは、安定した接続ではなく、将来有限の時間に終了する単一のタスクを対象としています。 ASyncTaskは素晴らしいですが、それは魔法の弾丸ではありません。 – CodeFusionMobile

+0

申し訳ありませんが、どこで使っているのか分かりませんでしたが、'20 odd odd/synchronized 'に基づいているのは、Javaプログラムにとってはまだかなり複雑です。 – user802421

+2

バックグラウンドのBluetooth通信については、代わりに継続的なサービスとして行うべきではありませんか? Androidシステムでサービスのスレッドを管理させ、アプリケーションでサービスと対話させます。 – fluffy

4

私の経験では、特定のオブジェクトへのアクセスにsynchronized(オブジェクト){...}を使用して、できるだけ細かいレベルでロックするのが一般に簡単で、しばしばパフォーマンスが向上します。また、同時に取得しなければならないロックがいくつかある場合は、常に同じ順序でそれらを取得していることを確認してください。

スタティックメソッドには、気になる奇妙な塊があります。同期されたインスタンスメソッドは、クラス全体ではなく、そのインスタンスにのみ同期されるので、インスタンスメソッドで同期する必要がある場合は、synchronized(this.class){.. 。}同様に、上記を適用している場合、実際には、特定のメソッドでアクセスしている静的フィールドに対してsynchronized()を行っているだけです。

一般的に、独自のスレッドを生成するのではなく、スレッド管理のためのシステムの既存のメカニズム(進行中の作業キューの場合はThreadPoolExecutor、非同期UI更新の場合はAsyncTaskなど) 。 ThreadPoolExecutorはパフォーマンスが向上する傾向にあり(マルチコアデバイスをより有効に活用することができます)、UIに対処するには余分な作業が必要です。一方、AsyncTaskは少し遅く重い傾向がありますが、UIスレッドでonPostExecuteコールバックも実行されます。

+0

これらのメソッド(ThreadPool、ASyncTaskなど)はすべて、作業が完了したときに終了するタスクまたは重い処理の何らかの形を実行するように設計されています。私は、アクティブなブルートゥース接続を管理し、数十の異なるデータパケットを送信し、接続状態と変数の多くを監視しています。このような非終了プロセスの場合、ASyncTaskとワーカースレッドは適切な選択ではありません。 – CodeFusionMobile

+0

私の3番目のパラグラフは、一般的な経験則としてのものであり、あなたの質問に特化したものではありませんでしたが、一般的にはまだ留意しておくべきことです。 – fluffy

関連する問題