• 締切済み

javaでスレッド内でパイプ処理を用いて処理をしているのですがデッドロ

javaでスレッド内でパイプ処理を用いて処理をしているのですがデッドロックが発生してしまいました。 Javadocには記載されているのですがどのような原因かが分からないので教えてください。

  • Java
  • 回答数2
  • ありがとう数1

みんなの回答

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

質問文にある内容だけでは回答できないので ・そのパイプ処理というのは具体的には何をしているのか  PipedInputStreamやPipedWriterなどのクラスを使った処理なのか、全く別の話なのか ・どうやってデッドロックであると判断したのか ・何のJavadocに何と記載されているのか を補足してください。

  • naoikun7
  • ベストアンサー率40% (2/5)
回答No.1

AがロックしているオブジェクトをBがウェイトしていて、BがロックしているオブジェクトをAがウェイとしているとか? お前が開放すれば俺も開放するよみたいなことをA,Bがお互いに言ってにらみ合っているような状態です。 この場合ロックする順序を一方に合わせればデッドロックは防げます。 詳しい状況が書かれていないので(書けと言っているわけではありません)何とも言えませんが一般的な原因はこういうものです。

関連するQ&A

  • java のスレッドについて

    java のスレッドについて javaでスレッドを作って処理をさせたいと思います。 メインのクラスでスレッドAを呼び出し、スレッドAで計算をしてその結果をメインのクラスで利用したい場合、一番簡単な方法は何でしょうか? なお、メインのクラスは、 while (Thread.isAlive()); な感じでスレッドが終わるまで処理を止めておきたいと思います。 簡単なコードを書いていただけないでしょうか?

    • ベストアンサー
    • Java
  • java スレッドの作り方

    はじめまして☆ 課題で、「あるディレクトリのデータファイル(テキストファイル)を定期監視し、ファイルがあれば読み取って出力するjavaプログラムを作成しなさい」と出されました。 そこで、定期時間に繰り返し監視しながら、ファイルがあれば処理するために、ファイル処理スレッドを作りたいのですがスレッドを作ったことが無く、まったくわかりません(>_<) 誰か教えてください!!

  • Javaのスレッドとcpuのスレッド

    javaのスレッドは各スレッドを少しずつ実行してあたかも同時に実行しているように見せかけているだけだと本で読んだことがあります。現在のcpuはi7 8700kだと6コア12スレッドになりますが、この場合どのような動きになるのでしょうか。 例えば12個のスレッドを使用したプログラムを実行するとpcが勝手に8700kの12スレッドに割り振って実行してくれるのか、それとも単にcpuの1スレッドでjavaの12スレッドを同時に動かしてるように見せかけるのか、cpuのスレッドとjavaのスレッドの関係がいまいち解りません。

  • Java:スレッドでエラー発生時に処理を終わらせる

    以下の事が出来ずに悩んでいます。 これ参考になるかな? というようなWEBページ等がありましたら、教えていただけると助かります。 ■やりたいこと ・aaa.javaから、「スレッド1」「スレッド2」「スレッド3」の処理を呼び出し、それぞれのスレッドで処理を実行する。 ・全てのスレッド処理が完了したら、次の処理へ進む。 ・「スレッド1、2、3」で、何かしらのエラーが発生した場合は、「aaa.java」の処理を終わらせる。 ■現状 ・aaa.javaから、「スレッド1、2、3」の処理を呼び出し、それぞれ処理を実行させる事は出来た。 ・すべてのスレッドが完了したら次の処理へ進む事は出来た。 ・「スレッド1、2、3」のどこかでエラーが発生した場合でも、処理の完了となり、「次の処理」へ進んでしまう。 もうちょっと細かい事を書くと、各スレッドでは、それぞれデータ作成のSQLを実行する処理をさせているのですが、 そのSQLが何かしらの要因でエラーで戻ってきた場合、次の処理へ進んでしまうとまずいです。 そのため、どこかのスレッドのSQLがエラーになったら、スレッドを呼び出した元の「aaa.java」でエラー・終了。となるようにしたいです。 一応、各スレッドでSQLのエラーとなった場合には「catch」に飛んでる。状態ではあるのですが、aaa.java側に戻って終わらせる事が出来ず。。。 ソースはだいぶ削りましたが、参考に以下記載します。 (削りすぎている可能性もありますが、その際はごめんなさい。) すみませんが、よろしくお願いします。 ---------------------------------------- aaa.java   public void Sql_Exec() throws SQLException, IOException {     /*     ループ条件の取得。(省略)     */     //ループ処理。     for (ループ条件(省略)) {       //スレッドの呼び出し。       //スレッド1       Thread_1 exec_1 = new Thread_1(引数もろもろ);       Thread thr_1 = new Thread(exec_1);       thr_1.start();       //スレッド2       Thread_2 exec_2 = new Thread_2(引数もろもろ);       Thread thr_2 = new Thread(exec_2);       thr_2.start();       //スレッド3       Thread_3 exec_3 = new Thread_3(引数もろもろ);       Thread thr_3 = new Thread(exec_3);       thr_3.start();       try {         //全てのスレッドが終わるまで待つ。         thr_1.join();         thr_2.join();         thr_3.join();       } catch (InterruptedException e) {         //例外処理         e.printStackTrace();       }     }   } ---------------------------------------- スレッド1~3.java public class Thread_1 extends Thread{   public void run(){     /*     ループ条件の取得。(省略)     */          //ループ処理。     for (ループ条件(省略)) {       try (Connection con1 = DB接続。) {         String sql1 = 実行SQL取得;         PreparedStatement pstmt1 = con1.prepareStatement(sql1);         int aaa = pstmt1.executeUpdate();         con1.close();       } catch (SQLException | IOException | JAXBException e) {         e.printStackTrace();         throw new RuntimeException("例外!");       }     }   } } ----------------------------------------

    • ベストアンサー
    • Java
  • スレッド1とスレッド2を交互に実行するには?

    スレッド1→スレッド2→スレッド1・・・と同期を取り合いながら交互にスレッドを動かしたいのですが、Thread.getState()を用いないで実現するよい方法はないでしょうか? どうしてもデッドロックが発生しうる方法しか思いつかず困っています。 例えば以下のプログラムで1212と交互に表示させたい場合です。 以下のプログラムは当然デッドロックになりますが、やりたいことを伝えるために載せておきます。 Object obj; //スレッド間通信用のobject class Test1 extends Thread {  public void run() {   while(true) {    System.out.print("1");    synchronized (obj) {     obj.notify();//相手をnotifyして     obj.wait();//自分はwait    }   }  } } class Test2 extends Thread {  public void run() {   while(true) {    System.out.print("2");    synchronized (obj) {     obj.notify();     obj.wait();    }   }  } } new Test1().start(); new Test2().start();

    • ベストアンサー
    • Java
  • javaのwaitしてるスレッドをnotifyで起こすことが出来ない

    JDK1.5 WindowsXPです。 現在マルチスレッドを試しています。 A、B、C三つのスレッドがあります。 AはBというスレッドを作るメインスレッドです。 Bは、waitするスレッドです。 public final void run(){  while (true){   try {    //notifyが来るまで待機    waitForNotify();    //実際の処理    act();    //スレッド停止させるための割り込み例外   } catch (InterruptedException e) {    Thread.currentThread().interrupt();    e.printStackTrace();   }   //割り込み受信の場合強制終了する   if (Thread.currentThread().isInterrupted()) {    break;   }  } } こんな感じです。 そしてCのスレッドがnotify()を実行します。 しかしnotify()を実行してもスレッドは起きません。 Bに、 public synchronized void notifyM() throws InterruptedException{   wait(); } のようなメソッドを追加して、スレッドのインスタンスメソッドとして実行しても起きません。 notify()がJavaDOCなどを読んでも意味不明なため、 どのような使い方なら動くのか見当がつきませんので質問しました。 notify(スレッドB)みたいなら分かりいいんですが。

    • ベストアンサー
    • Java
  • Javaスレッドの割り込みについて

    Javaのスレッド割り込み制御についてご質問です。 スレッドの割り込みの際に用いるメソッドinterrupt()は、 通常、対象のスレッドがsleep()やwait()状態の最中でアクセス不能な場合に使用しますが、 対象のスレッドが、sleep()やwait()以外の状態で、正常に動作している場合に interrupt()を実行した場合、どのような動きをするのでしょうか? 特に問題などありますでしょうか? お手数ですが、どなたかご教授願います。

  • Javaのマルチスレッド処理(スレッド数の上限)

    Tomcatを使用したWebアプリを作成しているのですがある処理を マルチスレッドで行う予定でいます。 画面でチェックボックスが100個チェックされたら100個スレッドを作成して それぞれのスレッドが通信を行うイメージです。 ここで以下の疑問があります。 1.一度に作成できるスレッドの数はTomcatがインストールされているOSに依存するのでしょうか。 2.もし100個が上限として101個スレッドを作成した場合、どうなるのでしょうか。 3.100個が上限とした場合、この数は一定でしょうか。何か別の全く関係のない重い処理が   実行されていてCPUに負荷がかかっていたりすると上限が10個になるということはあるので   しょうか。 4.一度に作成できるスレッドが100個とした場合、Tomcatが下記4人のリクエストを同時に処理   したらエラーという認識でよいでしょうか。それとも4人それぞれが100個ずつ(計400個)   スレッドを作成できるということでしょうか。   Aさん・・・30個のチェックボックスをONにして実行   Bさん・・・30個のチェックボックスをONにして実行    Cさん・・・30個のチェックボックスをONにして実行   Dさん・・・30個のチェックボックスをONにして実行 5.また、Javaプログラムで現時点で作成可能なスレッド数を取得することは可能でしょうか。

  • javaのスレッドの割込みについて

    javaのスレッド割込みに関する初心者の質問です。 割込みの発生元でCNTに値を設定し、割込みの受信元でCNTの値を読込み、表示しています。 下記のコードを参照ください。 Q1)CNTの値の設定と読込みで競合が発生する様なことはありませんか? 又は、処理が停滞するとか 以上、お手数をお掛けしますが、宜しくお願いします。 //割り込を発生するスレッド class threadA extends base{ private Thread target; public threadA(Thread targetA){ target = targetA; } public void run(){ for(int i = 0; i < 8;i++){ try{ System.out.print("."); Thread.sleep(1); CNT=i; target.interrupt(); }catch(InterruptedException e){ System.out.println("今割り込まれました: thread"); } } } } //スレッドからの割り込みを受信するルーチン class Sample108{ public static void main(String args[]){ //for(int i=0; i<2; i++){ classA obj = new classA(); obj.threadStart();//割り込みを受けるルーチン、この中で、割り込みを発生するルーチンを起動している //} } } //割り込みを受けるルーチン class classA extends base{ void threadStart(){ System.out.println("Start: main****"); threadA obj = new threadA(Thread.currentThread()); obj.start(); //Thread起動 //mainのルーチン for(int j = 0;j < 20; j++){ try{ Thread.sleep(1); System.out.print("*"); }catch(InterruptedException e){ System.out.println("今割り込まれました: classA CNT="+CNT); } } } } 以上

    • ベストアンサー
    • Java
  • 携帯のjavaでthreadを強制中断するには

    携帯のjavaでthreadを強制中断するには javaの thread には stop() で強制的に処理を止めることができると思いますが、携帯(DoCoMo)のjava では stop() が使えないのでしょうか? 携帯で思考をしている thread が一定以上時間がかかってしまったなら、諦めて中断させたいのですが。 今は、stop()が使えないので、中断フラグを使って中断させていますが、複雑な思考のなかで、いろいろな所に中断フラグを監視しなければならず、たいへん面倒です。 なにかうまい方法をご存知ならご教授ください。

    • ベストアンサー
    • Java

専門家に質問してみよう