2012-03-14 14 views
0

Javaの静的変数

FILE1パッケージPAKに次のように私は2つのjavaファイルのファイルfile1とfile2を持っている:

package pak; 
public class file1 { 
    public static int x=432; 

    public static void main(String[] args){ 
    System.out.println("y is "+file2.y); 
    while(x==432) { 
     System.out.println("x is "+file1.x); 
    } 

    } 
} 

ファイル2:

package pak; 
public class file2 { 
    public static int y=46; 
    public static void main(String[] args){ 

    System.out.println("x is "+file1.x); 
    ++file1.x; 
    System.out.println("x is "+file1.x); 

    } 
} 

私が最初にFILE1を実行し、それがします実行中で、別のシェルからファイル2を実行すると、x値がインクリメントされ、ファイル1のループから外れるはずです いくつかのplsが私を助けますか?

+0

*プロセス間通信*(IPC)について学ぶ必要があります。これは、実行しようとするほどシンプルではありません。 – Nim

+0

あなたは2シェルを使用すると言う...2つの別々のプロセスがあることも意味します。その場合、静的変数はfile1とfile2の間で共有されません。 –

+0

それから私はどのようにしますか?他の方法で? –

答えて

0

私はiostat.javaでプロセスを殺すkilljavaを実行し、ちょうど殺す前に、私はあなたがシャットダウンフックでこれを行うことができますつのアクション

を実行する必要があります。私は別のウィンドウでkill 29490を実行した後

public static void main(String... args) throws InterruptedException { 
    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 
     @Override 
     public void run() { 
      System.out.println("Final stats"); 
     } 
    })); 
    System.out.println("PID " + ManagementFactory.getRuntimeMXBean().getName()); 
    while (true) { 
     System.out.println("stats"); 
     Thread.sleep(2000); 
    } 
} 

プリント

PID [email protected] 
stats 
stats 
stats 
stats 
stats 
Final stats 

最後の行が発生します。


iは、2つの異なるプロセス

これはもちろんのこと、あまりにも多くの可能な解決策を持つ複雑な答えであるためにそれをどのように行うのでしょう。

これは、結果が同じであっても、一般的には、 "increment x"ではなく "stop process"のような高レベルの概念として行われます。

問題は高度なトピックとして、完全な答えを理解するためにプロセス間通信をよく理解する必要があることです。

単純な解決策は次のとおりです。それをしないで、あなたが望むことをする別の方法を見つける。

+0

これは簡単な方法ではできませんか? –

+0

簡単な方法がありますが、1つのJVMを使用します。 ;)あなたの例から、なぜ複数のプロセスを使いたいのかは分かりません。 –

+0

実際に私のプロジェクトでは、iostat.javaを1つのシェルから実行します...ログを生成します...そして別のシェルからkilljavaを実行してiostat.java内のプロセスを強制終了し、 1つのcsvファイルにアクション(つまり、ログの平均値、最小値、最大値を記録する)を実行することができます.... –

2

このような単純な方法では機能しません。どちらか

  • 実行同じプロセス内の二つの異なるスレッドからあなたの2つのmainメソッド内で現在のコード(つまり、Javaアプリケーション)、(そしてあなたも動作するように、このためfile1.xvolatileを宣言する必要があります)、または
  • 上記のように2つの別個のプロセスを実行しますが、それらのプロセスを互いに通信させる必要があります。これは簡単ではありません。そうでなければ、2つのプロセスはそれぞれfile1.xのコピーを持ちますので、一方のプロセスの変更は他方のプロセスに対しては見えません。
+0

2つの異なるプロセスに対してどのようにしますか –

+0

Nimが述べたように、これはプロセス間通信(IPC)と呼ばれるトピックです。私はそれを直接経験していないので、いくつかのリンクを提供する以上にあなたを助けることはできません:http://docs.oracle.com/javase/tutorial/rmi/index.html、http://publib.boulder.ibm。 com/infocenter/iseries/v5r4/index.jsp?topic =%2Frzaha%2Finterpro.htm、http://stackoverflow.com/questions/1416780/java-interprocess-communication –

0

あなたは2つの異なるjvmプロセスを呼び出しています。両方のプロセスには、file1file2のコピーがあります。あるプロセス内の静的変数の変更は、他のプロセスでは見られません。