- Java入門・初心者質問スレ Part.9
780 :デフォルトの名無しさん[sage]:2020/03/25(水) 08:15:14.54 ID:S+BBkcDL - Clip は、再生前に音声データを全部ロードしてから使うクラスで、
インスタンスを使い回さず、再生前に再生時間の取得とかが必要ないなら、 SourceDataLine を使ってリアルタイムにストリーム化した再生をしたほうが良い 「AudioInputStream がスレッドセーフじゃないっぽい」というのは本来はあまり関係なくて、それを使ってる Clip が実装内で同期化してるなら問題ない 質問者のコードは何故か毎回 open してるからあれだけど、Clipを使う場合、open時に受け渡すだけの AudioInputStream は、Clip の中以外で複数スレッドでは使わないでしょうし Clip の API見たらスレッドセーフと明示されてるわけじゃなくて、本当は Clip の実装クラスが同期化してるかによるけど >>778 の下の方のソースコードで問題ないと思う 細かいことをいえば、 Clip[] clips = { create("C:\\Users\\a\\Desktop\\work\\decision1.wav"), create("C:\\Users\\a\\Desktop\\work\\decision2.wav"), create("C:\\Users\\a\\Desktop\\work\\decision3.wav") }; この変数自体が同期化されてないとか ロード、アンロード、ストリーム化した再生、同期化、複数同時再生とやってったコードあるけど、ここには書けない
|
- Java入門・初心者質問スレ Part.9
781 :デフォルトの名無しさん[sage]:2020/03/25(水) 08:31:00.19 ID:S+BBkcDL - 補足)
>>778 の下の方のソースコードで問題ないと思う といったけど、再生終わる前に再生すると壊れるから、やっぱりちゃんと同期化は必要かな
|
- Java入門・初心者質問スレ Part.9
784 :デフォルトの名無しさん[sage]:2020/03/25(水) 09:23:39.45 ID:S+BBkcDL - >>781
final でない変数を複数スレッドで使う場合は常に同期化が必要 > スレッドが起動するときに同期化は行われるはず たしかに、実質的に final なら動作上は問題ない、だから「細かいこと」 でも、final にしてないなら作法上やっぱり同期化は必要(final Clip[] clips でもダメだからね) 自分だけが見て、自分だけが書くプログラムなら好きにすればいいよ
|
- Java入門・初心者質問スレ Part.9
785 :デフォルトの名無しさん[sage]:2020/03/25(水) 09:33:23.96 ID:S+BBkcDL - >>783
ごめんね、やっぱり問題なかったわ… 再生中に再生しようとすると、無視されるだけだった
|
- Java入門・初心者質問スレ Part.9
788 :デフォルトの名無しさん[sage]:2020/03/25(水) 10:35:06.66 ID:S+BBkcDL - >>787
> finalにするとコンストラクタの処理が完了した時点での可視性が保証されるってことでしょ 違う、そういう意味で final の場合は同期が必要ないって言ってるんじゃない final にすると書き換えられないから、一度可視になればそのままの値であることがずっと保証されてる 一方、Clip[] clips の場合は final じゃないから、値が更新されたらその時点で同期が保証されない 作法としては、final じゃない、複数スレッドに渡って使用する変数は常に同期は必要
|
- Java入門・初心者質問スレ Part.9
793 :デフォルトの名無しさん[sage]:2020/03/25(水) 11:15:56.14 ID:S+BBkcDL - >>792
> final Clip[] clips でもダメだからね ってちゃんと書いてるからね
|