• ベストアンサー

threadの中でのメモリ??

スレッドが途中で止まってしまいます。 理由としておそらく毎回while(true)の中でファイル出力の BufferedPrintWriter pw = new BufferedPri.... を定義しているからかかなぁと思うのですが、 他のファイルで出力先のファイルを読み込んだりしてもいるので、毎回1行目に追加したくてこの方法を取っているのですが、 一応pw.flush()とかはしています。 かつThread.sleep(100)とかもしています。 止まってしまう理由はやはりここでしょうか? とまらない時もあります。 ほかの部分を考えた方がよいでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.3

1,2はまあ、いいとしましょ 3.checkendがいきなりfalseだったりするとpwはnullのままかもよ?  全体のソースを知らないので言い切れないけど。  無駄なNullPointerExceptionの回避のためにも  ストリームやコネクションのcloseの際はnull判定をする癖をつけたほうがいいわ。 4.今はpwのインスタンスを作った直後にpwをcloseしているけど  将来実装が拡張されたとき、その保証はないでしょ?  ストリームやコネクションのクローズは、  その変数を宣言したのと同じスコープで行うべきよ。  そうしないと変数の管理が複雑になるわ。 6.処理の一番上っていうのがどこだかわからないけど。  どちらにせよ、何かエラーや例外が起きているわけではないのね。  だとすると、どの処理を行おうとして、それが行われないのか  ていう場所が判明しているのね。  その周辺に原因がありそうよ。  毎回止まるところ決まっているなら  まずそこから疑うべきね。 8.何をやっているのかわからないメソッドが原因というのは決してない話ではないわ。  はっきり言ってしまうけど、  あなたと同レベルのスキルの人が作ったメソッドだと正直怪しいわね。  別にfor文20回まわした所で問題はないだろうけど  そこでとまったとするなら疑っていいかも。  別のところでとまるならとりあえず気にしなくてもいいかもね。

kkkkeeennn
質問者

お礼

ふむぅ・・・難しいですね>< ありがとうございます! 宣言文の場所やらcloseをきちんとやったりしたら 止まる回数は減りました!たぶんもうちょいだと思います>< むちゃくちゃ丁寧に答えてくださってホント助かりました!!!!!! ありがとうございます! ps もうちょい勉強しまする・・・w

その他の回答 (2)

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.2

ツッコミどころ満載よー 1.最後のcatchに対応するtryがない。まあこれはいいとするわ。 2.pwの宣言はどこで行われているの? 3.pw.closeするとき、pwはnullじゃない保証あるの? 4.pw.closeする前に例外が起きたらpw.closeされないわね 5.linearStreamがcloseされていない 6.止まるって言っているけど、どこで止まるの?   OutOfMemoryErrorが出るの?   何も出ずにずっと待ち状態になるの? 7.whileブロックを抜ける条件がlinearStream.read(buffer,0,buffer.length)==-1なら   linearStream.read(buffer,0,buffer.length)!=-1をwhileの条件にしたら? 8.sleep、Checkfirst、Checkin、Checkendの中身は信頼してダイジョウブ? とりあえずここまで

kkkkeeennn
質問者

補足

ありがとうございます。 1.2.すいません。途中の文を抜き出したもので・・・ 3.一応毎回呼び出してるのでよいかなと思ってしまいました。改訂版ではwhile(true)の中で毎回pwの宣言をしています。 4.例外というのはどういった事があたりますでしょうか? 5.いちおうずっとあけっぱにしておこうかなぁとおもっていました。これも閉じた方が良さそうですね。そうします>< 6.止まらないときもあります。止まるときは、大抵処理の一番上からです。 7.あ、そうします。ありがとうございます 8.いちおうこのクラスがスレッドで宣言されているのでsleepはいじっていないです。ほかのは値を返すだけなので大丈夫だと思うのですが、これらの処理が多すぎると止まるとか言うことはあるのでしょうか?(この中でfor文20回くらいまわす等・・・)

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

実際にどんなコーディングしているのかさっぱりわからないし そもそも質問の「メモリ」って何? もしかしてOut Of Memoryのこと? 言葉はグローバルにね。 > 理由としておそらく毎回while(true)の中でファイル出力の > BufferedPrintWriter pw = new BufferedPri.... 必要なら別におかしいことではないわ。 > 一応pw.flush()とかはしています 使い終わったストリームはcloseしなきゃだめよ。

kkkkeeennn
質問者

補足

あ、ありがとうございます。 すいませんメモリはよくわからなく使ってしまいました>< なんかそんなのあったな的な・・・ closeは一応しています。 ソースは以下です(めんどくさいと思うので読まなくていいですが一応)音系を扱っています。bufferをいじる事で音が入ったか否かは判断できそうだったので、 System.out.println("name"+"入力開始"); //リニアPCM8000Hz16bitモノラル符号付きリトルエンディアン8000,16,1,true,false AudioFormatlinearFormat=newAudioFormat(8000,16,1,true,false); //ターゲットデータラインを取得する DataLine.Infoinfo=newDataLine.Info(TargetDataLine.class,linearFormat); TargetDataLinetargetDataLine=(TargetDataLine)AudioSystem.getLine(info); //ターゲットデータラインをオープンする targetDataLine.open(linearFormat); targetDataLine.start(); //マイク入力開始 while(true){ try{ //ターゲットデータラインから入力ストリームを取得する AudioInputStreamlinearStream=newAudioInputStream(targetDataLine); //入力ストリームから音声データをByte配列へ取得する linearStream.read(buffer,0,buffer.length); firstin=buffer[1]; Checkfirst(); //ソースデータラインを取得する //音声ファイルの終端まで繰り返す while(true) { this.sleep(40); if(linearStream.read(buffer,0,buffer.length)==-1) break; System.out.print(buffer[1]+" "); incheck[in]=buffer[1]; endcheck[out]=buffer[1]; //音が入ってきたかどうかを調べるもの Checkin(); in=in+1; out=out+1; if(in>=incheck.length) in=0; if(out>=endcheck.length) out=0; if(!checkend){ Checkend(); pw=newPrintWriter(newBufferedWriter(newFileWriter(file))); //checkendは音が入ってきたかどうか pw.println(!checkend);} pw.close(); } } catch(Exceptione) {}} } catch(Exceptione) { e.printStackTrace(); } } エラーは出ないのですが、スレッドが止まってしまう事があります。 現在複数音源を扱っていて、音が入ってきた事を別のスレッドがファイル経由で検知し、音源を切り替えるという作業をしています。止まってしまうのが音源を変えるときか情報をやり取りしたときかが多かったので、何か問題あるのかなと思いまして・・・

関連するQ&A