Java入門・初心者質問スレ Part.9
■ このスレッドは過去ログ倉庫に格納されています
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") }; この変数自体が同期化されてないとか ロード、アンロード、ストリーム化した再生、同期化、複数同時再生とやってったコードあるけど、ここには書けない 補足) >>778 の下の方のソースコードで問題ないと思う といったけど、再生終わる前に再生すると壊れるから、やっぱりちゃんと同期化は必要かな >>780 なるほどね clipsの変数が同期化されてないのは可視性の話? スレッドが起動するときに同期化は行われるはず >>781 そのへんClipがやってくれないん? 困ります! >>781 final でない変数を複数スレッドで使う場合は常に同期化が必要 > スレッドが起動するときに同期化は行われるはず たしかに、実質的に final なら動作上は問題ない、だから「細かいこと」 でも、final にしてないなら作法上やっぱり同期化は必要(final Clip[] clips でもダメだからね) 自分だけが見て、自分だけが書くプログラムなら好きにすればいいよ >>783 ごめんね、やっぱり問題なかったわ… 再生中に再生しようとすると、無視されるだけだった >>778 どうも、昨日の質問者です。わざわざプログラムまで書いて頂いてありがとうございます。下の方ですが、これを Chime chime = new Chime(); chime.play(0); と使えば完璧ですね。ですが、 new Chime().play(0); にすると Direct Clip が再生した回数分増えていかないですか? そして上の方ですが、0.2秒間隔で500回再生してみると、通常は スレッド[Thread-124](実行中) デーモンスレッド[Direct Clip](実行中) スレッド[Thread-125](実行中) デーモンスレッド[Direct Clip](実行中) スレッド[Thread-126](実行中) デーモンスレッド[Direct Clip](実行中) というようにデバッグビューに表示され、音が鳴ります。しかし時々 スレッド[Thread-124](実行中) スレッド[Thread-125](実行中) スレッド[Thread-126](実行中) デーモンスレッド[Direct Clip](実行中) デーモンスレッド[Direct Clip](実行中) デーモンスレッド[Direct Clip](実行中) 表示がこのようになり、その間音が止まります。そしてまた元に戻ったところでたまった音が一気に鳴るような現象が起きます。 そしてこの現象が起きる度に消えない Direct Clip が一つ増えます。この現象が出ているのはうちだけでしょうか? >>784 finalにするとコンストラクタの処理が完了した時点での可視性が保証されるってことでしょ 一方でスレッドが起動するときにもhappens-beforeのセマンティクスは適用されるから同期の目的が可視性ならfinalつけなくても問題ないと思ったんよ >>787 > finalにするとコンストラクタの処理が完了した時点での可視性が保証されるってことでしょ 違う、そういう意味で final の場合は同期が必要ないって言ってるんじゃない final にすると書き換えられないから、一度可視になればそのままの値であることがずっと保証されてる 一方、Clip[] clips の場合は final じゃないから、値が更新されたらその時点で同期が保証されない 作法としては、final じゃない、複数スレッドに渡って使用する変数は常に同期は必要 >>788 そういう意味ね 状態変えられたらどうしようもないし 変数に再代入してるところないし 上のコードは同期取れてるけど一般論としてはということね なるほどね >>786 ループのたびにインスタンス作るやり方だと5000回 回してもうちのPCでは再現しなかったんよね 条件が足りてないのかもしれないけど >>790 うちの環境のせいかもしれませんね。これ以上は諦めることにします。 >>781 そこにfinal付けるかどうかこの例だと全くどうでもいい。 配列・オブジェクトに対するfinalとは? もちろんfinalを可能な限り付けることは推奨だけど。 >>792 > final Clip[] clips でもダメだからね ってちゃんと書いてるからね >>786 単にそのライブラリが、非同期・マルチスレッドに対応していないのだろう。 対応していない機能を使うから、バグるのでは? ライブラリには、シングルトンみたいな単一オブジェクト・資源を使っているものがあって、 それを共有できないものが多い だから、ライブラリの説明書には、 このライブラリはマルチスレッドでは使えない、などと書いてあるものが多い 複数の効果音を同時に使えるライブラリなどは、特殊なんだと思う。 Windows だけとか、OS を限定される OSS・Linux 系のライブラリでは、マザーボード上のチップ内の特殊なネイティブ機能は使えないのでは? 普通これらでは、ハイバネートから戻れないとか、電源機能などもまともに動かないだろ ヤマハなどの音源チップと、ライブラリのAPI が、バージョン違いで一致しないとか 基本、マザーボード上のチップは、Windows 限定だろ。 OSS・Linux 系のライブラリでは、正常に動くかどうか分からない まーた頭悪い奴等同士でグダグダ交換日記してるよ ほんとキチガイやなこいつ等 まとめて逝って良し まぁ一番イラつくのは全てが他力本願の頭のイカれた質問者だけどさ やってること同じなのにちょっとデバッグウィンドウの表示ちがうだけで 「〇〇じゃないですか!?なんでですか!?」って バカかとアホかと 少しはテメーで考えろボケカス ほんとこういうのに答え教えても何の意味も価値も成長もないんだわ >>786 >>778 のChime2(後者の実装)をnew Chime2().play(i)で100回とか呼んだ場合ですよね? うちでもDirect Clipのdaemon threadが増殖しますよ。 実行環境にもよるのかもしれませんけど、 Direct ClipスレッドはClip.open(ais)で生成されて、Clip.close()後に終了するようです。 Chime2ではclip.close()が呼ばれないのでスレッドが残るのでしょう。 (おお、やっと書き込めた...why?) (続き) 778の前者の実装(CountDownLatchを使った方)は、 try-with-resources文でclip.close()が暗黙に呼ばれるので chimeインスタンスを使いまわしても、new Chimeを繰り返してもスレッドは増殖しないですね。 確認した環境: AdoptOpenJDK 12.0.1+12, 64bit Server VM (Hotspot) (オーディオデータは C:\Windows\Media\notify.wav 等) $ java --version openjdk 12.0.1 2019-04-16 OpenJDK Runtime Environment AdoptOpenJDK (build 12.0.1+12) OpenJDK 64-Bit Server VM AdoptOpenJDK (build 12.0.1+12, mixed mode, sharing) 漏れらは、動かないゲームエンジンとか知ってるから、音なんて出ない方が多いぐらいw Pixi.js をコアにした、Phaser は音が出るらしいとか、そういう噂で決める 大手のブラウザみたいに、Windows 用を別に作っているものは、半分ぐらいは動くけど、 OSS・Linux 系のライブラリでは、ソースコードを書いてるだけだから、 それをWindows ネイティブの機械語に変換した場合に、動くとは限らない 無線LAN でも、半分は動かない。 各メーカーで、ドライバーを作っていれば動くけど msys2/mingw で、Windows 用にコンパイルしても、互換性が低い。 WSL の方が、MS が作っているから、互換性が高い ヤマハが、Java・OSS 向けのドライバーを作っていれば動くけど、まさか作っていないだろ >>802 解決しました。コンパイラのバージョンが1.8になってました。 Eclipseを最新のものにしていないせいか11までしか使えないのですが、それにしたら症状が消えました。 ありがとうございました。 >>804 解決してよかったですね。 ただ、その報告では結局何をどう変更して解決したのかこちらは分からないです。 個人的には Clip.close() を呼ばなくても大丈夫な場合/環境があるのか気になります。 >>806 >>778 の上のプログラム、CountDownLatchを使った方ですね。それを500回 new した時に その時々によりますがDirect Clip が3つから6、7個くらい残るという症状でした。 で、それを入れていたプロジェクトが使うコンパイラのバージョンを1.8から11に上げたらきれいに直ってしまったということです。 プログラムの方は何もいじらずそのままです。 >>807 うちでも、Java 8でCountDownLatch版で new Chime().play(i) を連続で500回呼ぶのを10回ぐらい実行したら一回だけDirect Clipスレッドが一つ残りました。 見てみると、 com.sun.media.sound.DirectAudioDevice$DirectClip.run() の(コメント込みで)10行目ぐらいの lock.wait() で止まっていました。 この箇所の実装をJava 8とJava 12で比較すると少し修正されています。 Java8 の実装だと while (thread == curThread) { で thread == curThread が true と判定した後、 synchronized(lock) { ※ で同期化ブロックに入る前に DirectAudioDevice$DirectClip.thread フィールドが変更されていた場合、 そのまま lock.wait() に突入してしまうタイミングがあるように見えます。 つまり DirectClip.run() が※のモニタを取る前に DirectAudioDevice$DirectClip.implClose() が DirectClip.thread = null として lock.notifyAll() してしまうと、 DirectClip.run() の lock.wait() は来ない通知 (lockのnotify) を待ち続けることになるのでしょう。 Java12 では DirectClip.run() の synchronized(lock) を取ってすぐに while (!doIO && thread == curThread) { で DirectClip.thread フィールドをチェックするようになっているので、 絶妙なタイミングで DirectClip.implClose() に割り込まれても大丈夫なようにライブラリが修正されたのでは無いでしょうか。 リリースノートかbug paradeを丹念にチェックしたら、どこかに載っているかもしれません。 そもそも説明になってなさすぎる まともな文章書けないガイジはレスすんのやめろ マジキチ ■ Java 質問スレのググれカス君とは 質問と回答に対して罵倒を続ける荒らし 罵倒はワンパターンで、ググれカス、ゴミ、馬鹿、キチガイ、低能、チョンなどを多用します プログラミングの基礎知識がないため、技術的な事はほとんど言いません 過去の発言でクラス変数とインスタンス変数を勘違いしていたり、基本的な事も理解できていないことが判明しています どんな回答がついてもそれが間違いだと主張しますが、根拠は示しません あなたの質問についた回答が正しいかどうかは自分で判断して下さい 彼は自分に対する批判は全部自演だと思っているようなので、構うだけ無駄です 図星突かれたらすぐ顔真っ赤にして捏造する癖やめたほうがいいぞ低能ゴミカス アホ 説明になってなさすぎる (自分も説明は出来ない) ってパターン多すぎてネタ化してる ロック取ってループで条件チェックはマルチスレッドの基本だけれどそれやってなかったんだなー標準ライブラリにもバグが潜んでるものなんだなー ゲームエンジンとか、まともに音が出る方が少ないw それに、色々なブラウザで動かないから、Chrome 限定にする Pixi.js をコアにした、Phaser は音が出るらしいとか、 そういう噂ばっかりを集めて、皆で動くエンジンへ移動するw 開発者は、動かないエンジンを修理するよりも、 皆で動くエンジンへ移動するw クラス変数とインスタンス変数を勘違いした発言なんかしたら、俺だったら恥ずかしくて二度とスレに来れない おまえの馬鹿さを指摘してやってるだけなのに どう解釈したら勘違いしてるって思えるのか低能すぎてこえーわ バカのくせに開き直って妄想で捏造書き込むキチガイもほどほどにしとけゴミカス低能 どんだけ根にもってんだキチガイ >一応だけどクラス変数はインスタンスを作らなくても使用できる変数で もっかい書いてやるけどつかえねーから馬鹿 アンロード君 classNotFound君 同期化君 インスタンス作らなくても変数が使えちゃう君 全員入門書レベルのゴミがなぜか捏造して叩いてくるんだよな ほんまキチガイの巣窟すぎてやべーわここ 英語も読めないプログラム全般の基本的な動作も理解してないゴミ糞低能の分際で 「おまえは勘違いしてる!(キリィイイイ!」とかわけのわからん馬鹿捏造解釈で 延々と叩くことしかできないキモさはお隣の国そっくりやな バカチョンコミュニティかここは?ん? 変数がどうたらとかくだらなすぎて書く気すら失せるから ほぼほぼスルーしてたんだけど黙ってたら延々と言って来るからな低能って ほんとゴミにはしっかり言ってやらんとダメだと再認識したわ >>820 クラス変数はインスタンス作らなくても使えるよ >>820 クラス変数とインスタンス変数は違うよね? >>824 質問に答えてないじゃんかー ずるいじゃんかー 答えろじゃんかー >>824 クラス変数とインスタンス変数は違うじゃんか? だからなに?いつ同じって言った?ん? 違ってもインスタンスなくても使える?は?アホ 一人でわけの分からんこと言って勝手に決めつけて まともな文章も書けないしもう回れ右しとけ低能 まぁ学生だろうけどまともな文章書けるようになってから出直せアホ それにしてもどうやったらこんな馬鹿なことを 延々と喚けるのかアホの頭はホントハッピーセットすぎてやべーわ >>827 じゃあ違うのん? どうなのん? はっきりしてのん? >>828 はっきり答えてないないじゃん はっきり答えてじゃん アホ「クラス変数はインスタンスなくても使える!」 聖者ワイ「アホ君、変数っていうのはね中身入ってないと使えないよ」 アホ「こいつはクラス変数とインスタンス変数が同じと思ってる!(キリィイイイ」 聖者ワイ「何言ってんだこの馬鹿・・・」 ほんとキチガイは意味不明過ぎてヤバいね >>831 変数に中身が入ってるかの話を僕がしてないのはわかりますよね わかってなかったのを僕は許します その上でクラス変数とインスタンス変数は違いますよね? >変数に中身が入ってるかの話を僕がしてないのはわかりますよね エスパーじゃないんだからお前の低能な頭の中をみんなが理解してたら凄いことだね いいかい、アホ君。変数というのはね、中身があって初めて”使える”っていうんだよ おまえの脳内設定の意味のわからん”使える”は万人に適用できないんだよ わかるかい?アホ こんなアホ理論が通用するのは学生のうちだけだからよく覚えておけよ糞アホ君 そして違うとか違わないとかこれまた意味の分からん比較の話に飛ぶのも キチガイ脳すぎて相当ヤバいよアホ君 脳専門の病院に行ったほうがいいよマジで >>833 変数を使うの定義をすり替えてますよね 質問してるのは僕なので僕の定義に完全服従する義務が あなたにはありマフ 責任感を持って質問に答えてください クラス変数とインスタンス変数は違いますよね? >>834 わかるよね?わからないの?本当に? 本当に質問の意味がわからないのん? どうなの?正直に言って はい、終わり バカの文章見るのキツイ もう日本語として破綻してる 人生がんばれよアホ君 君の別名はシンプルにアホ君な アンロード君 classNotFound君 同期化君 アホ君 あほあほ四銃士 >>837 逃げるん? クラス変数とインスタンス変数の違いを聞いてるんよ 答えられずに逃げてまうん? 初心者未満は相応のスレに行きましょう ここは初心者スレです >>840 できるよ。そう、Groovy,Scala,Kotlinならね マジレスするとcommons langのStringUtils.joinとかMapUtils.verbosePrintあたりを活用してお茶を濁すくらいだな AbstractMapっていい感じにtoString実装してるんだな 何故かできないものと思い込んでた こういう思い込みのアホって何で回答するんだ? 脳に蛆でも沸いてんのか?自演か? またアンロード君か同期化君が知ったかでレスつけてんのか? 目立ちたがり屋の妄想家は回れ右してSNS!!!! >>846 インスタンス変数をクラス変数と思い込んで回答した君が言うかねwww あることないこと勝手に喚き散らして一人で妄想してマウント取ろうとする病気の奴ってなんていうんだろうな こういうキチガイがきっと宗教とかにハマるんだろうね ほんとこういうキチガイの為にツイッターとかがあるのになんでこのスレ見てんだって感じだな アホ >>849 他人に暴言吐いてるのに自分がマウントされるのは嫌なんだw繊細なんだなwwwwwww Javaスレのデリケートプリンセス、略してプリンちゃん そら俺は正しいことしか言ってないからな 正しいならいくらでもマウント取られてもいいけど おまえなんて妄想と開き直りで俺がレスするたび繰り返しわけのわからんことを書いて荒らしてるゴミだからな しつけーんだよ糖質が とっととSNSに帰れよゴミ >>852 終電なくなっちゃったの・・・泊めてくれないか 仕事してる妄想か?ん? 文章まともに書けない奴に出来る仕事なんてないぞ クラス変数とインスタンス変数間違うって、もしかして入門書すら全部読んでないんかな >>856 >>831 いい加減死ぬか病院行けキチガイ >>858 またお前か。いい加減死ねよ。生きてる価値ないんだから。 トリップで検索すると、救われない系の人間のクズだな 救われないというか救ってはいけない系というか すいません、どうしても過去の遺恨がありまして一言書き込みたかったんです とあるドアホコテのせいで俺が悪いということにされてしまいまして… >>859 そこまで言うことないだろ それぞれが別パッケージにある同名クラスを同時に使いたい時ってどうすりゃいい? 今、Jsoupを使って、HTMLを解析して、その解析結果をXMLファイルに出力しようとしてるんだけど、 JsoupにもJDKにもDocumentクラスがあるんだけど、この2つのクラスを同時に使いたい。 でも名前がバッティングしてるからエラーになるんだが? 片側のクラス名をパッケージからフルで書けばエラーは消えるのでは。 IDEで修正してくれないの。 >>865 そうします。 HTMLの解析に使えるライブラリにJsoupがあるけど XML文書の入出力に使えるライブラリって何がありますか? 元からあるorg.w3c.domパッケージは1つ1つの命令文が面倒なんでw jqueryみたいに手軽に使えるのがあれば良いんだが。 全部ググれば3秒で解決することをここで聞くな アホ ググレカス君はコロナにかかれば「うつしてやるおじさん」になりそう ■ Java 質問スレのググれカス君とは 質問と回答に対して罵倒を続ける荒らし 罵倒はワンパターンで、ググれカス、ゴミ、馬鹿、キチガイ、低能、チョンなどを多用します プログラミングの基礎知識がないため、技術的な事はほとんど言いません 過去の発言でクラス変数とインスタンス変数を勘違いしていたり、基本的な事も理解できていないことが判明しています どんな回答がついてもそれが間違いだと主張しますが、根拠は示しません あなたの質問についた回答が正しいかどうかは自分で判断して下さい 彼は自分に対する批判は全部自演だと思っているようなので、構うだけ無駄です >>870 丁寧にテンプレ纏めてくれてるけど、健常者には>>867 の1レスを見た瞬間にすぐに察したけどな まぁこういう奴は、恐らく現実世界での自分の無能さと周りの健常者の実力の余りもの落差に、自分の過剰でしょうも無いゴミプライドが傷ついたから、 ネット上でこうやって人のすることにケチ付けて自分のゴミプライドに付いた傷を舐めて癒やしてるつもりなんだろうな こういう人間は一生成長しない。 新しく勉強して知識増やしてきてる新参に次々と追い抜かれて益々偏屈なゴミ人格が酷くなるだけ 完全な負のスパイラルに入ってるパターン 関わって何の得も無いから、無視が誰にとってもベスト ↑一応追加テンプレに使えるんじゃね?w 毎回アホな質問してる奴も毎回ワイを逆恨みの妄想で貶してる奴も同じ奴だから注意な アホな文章からして恐らくアンロード君かアホ君のどっちかなのは確実w ほんとバカってわかりやすいわw アホ 「同じ名前のクラスはどうやってらつかえまちゅか!(キリッ!!!」 バカかとアホかと こんな初心者未満の糞低レベルなことをここで聞く前に なぜググることもできねーのか低能 そしてこういうくだらないことに回答つけるから馬鹿が増長して 延々と質問を繰り返すんだよ 消えろゴミ アホ 何の脈絡もなくいきなりjquery出てくるところとかまさに馬鹿っぽいし まぁこの感じはいつもの馬鹿アンロード君だろうな アホ ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる