2009-05-04 35 views
0

4つのメソッドでクラスを作成しました。私はそれらにprintステートメントを挿入したので、正しく動作するかどうかを確認できました。最初の3つに問題はありません。しかし、私が4番目の方法を呼び出すと何も印刷されません。私がデバッガを起動し、メソッドを段階的に移動すると、ステートメントが呼び出され(そして出力されます)、不思議です。どうすればいいの?実行時に呼び出されない印刷メソッドは、デバッグ時に呼び出されます

ありがとうございます。問題の

方法:それを呼び出す

public void robin(int counter, int quant, int penalty) { 

    if(Schedulers.quant==-1) { 
     Schedulers.quant=quant; 
    } 


    while(p!=null && p.getArrival()==counter) { 
     qrobin.add(p); 

     if(i.hasNext()) 
      p=i.next(); 
     else { 
      p=null; 
      break; 
     } 
    } 

    if(active!=null) { 
     if(active.getLeftOver()>0 && Schedulers.quant>0) { 
      active.decreaseLeftOver(); 
      Schedulers.quant--; 
      System.out.print(active.getPID()); 
     } 
     else if(active.getLeftOver()>0 && Schedulers.quant==0) { 
      qrobin.add(active); 
      active=qrobin.poll(); 

      Schedulers.quant=quant; 
      Schedulers.quant--; 

      if(active!=null) { 
       System.out.print(active.getPID()); 
       active.decreaseLeftOver(); 
      } 
      else 
       System.out.print(" "); 

     } 
     else { 
      active=qrobin.poll(); 

      Schedulers.quant=quant; 
      Schedulers.quant--; 


      if(active!=null) { 
       System.out.print(active.getPID()); 
       active.decreaseLeftOver(); 
      } 
      else 
       System.out.print(" "); 

     } 
    } 
    else { 
     active=qrobin.poll(); 

     Schedulers.quant=quant; 
     Schedulers.quant--; 

     if(active!=null) { 
      System.out.print(active.getPID()); 
      active.decreaseLeftOver(); 
     } 
     else 
      System.out.print(" "); 
    } 

}

コード:

while(true){ 

     algorithm(algorithm,s,counter); 

     counter++; 
    } 
+2

コードを見ずに何か言いたいと思いますか?クリスタルボールの使い方? –

+0

問題が何であるかわかるように、コードを投稿してください。 – BobbyShaftoe

+0

コードを記入してください。 – Naveen

答えて

0

これを実現するための多くの理由があります。しかし、それ以上の情報がなければ、あなたを助けることはほとんど不可能です。

0

残りのクラスやそれ以外のクラスを使用していないと確定できないとは言えませんが、競合状態になる可能性があります。たとえば、複数のスレッドが互いに予測できないファッション。特に、Schedulers.quantの多重使用は、明らかに非同期静的変数であり、非常に疑わしいと思われる。

本当に競合状態であれば、this bookを読んでからコードを修正してください。マルチスレッドの問題は非常に複雑で、マルチスレッドのコードを書く前に理論を理解する必要があります。

+0

マルチスレッドが含まれていません。今のところ。表示されるすべてのメソッドは、他のメソッドで使用されています。 "quant"変数だけがこのメソッドに固有であり、単純なプリミティブ型の整数型です。 – ark

+0

特に困惑しているのは、デバッガを実行するとうまく動作するということです。これは私には完全に非論理的です。 – ark

+0

さて、コードがマルチスレッドで実行されると、その変数が問題になります。メソッドに「ユニーク」なのかどうかは関係ありません。重要なことは、複数のスレッドからアクセスされ、同期がなくても「quant--」さえ正しく動作しないことです。 –

1

明らかな答えはないように見えます。プロジェクトの残りの部分がなければ、問題を再現して分析することはできません。

このような説明できない振る舞いを解決する方法は、振る舞いを維持しながら、つまりそれに関連していないすべてのコードを取り除き、問題がまだ存在するかどうかを確認しながら、できるだけコードを減らすことです。そうでない場合は、いくつかのコードを追加して戻ってください。最終的には、問題の原因となる変更を特定し、そこから実際に何が起こったのかを推測できるはずです。

0

コードを「実行」するとき、どうやってそうしていますか?それは標準出力がリダイレクトされるかもしれない何らかの種類のサーバーまたはコンテナ内で「実行されていますか?これは私が疑うものです。

System.outをデバッグとトラブルシューティングに使用することは面倒なことがあり、一般的にはかなり悪い習慣です。log4jなどのログフレームワークを使用することをお勧めします。このようにして、ログ出力の送信先を推測する必要はありません。

0

アクティブ変数がnullの場合は、常に ""を印刷するだけなので、コンソール出力には気付かないかもしれません。これは、デバッグで実行したときにアクティブになることがないようにするタイミングの問題である可能性があります。

関連する問題