java静态变量

时间:2012-03-14 11:05:05

标签: java

我在包pak

中有两个java文件file1和file2

文件1:

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并且它将运行,当我从另一个shell运行文件2时,它应该增加x值,它应该在文件1中循环出来 可以请一些人帮助我吗?

3 个答案:

答案 0 :(得分:2)

它不会以这么简单的方式工作。你要么

  • 从同一进程中的两个不同线程(即Java应用程序)中运行当前在两个main方法中的代码,(并且还需要为此file1.x volatile声明工作),或
  • 运行如上所述的两个不同的进程,但是你需要让它们相互通信,这远非微不足道。否则,每个进程都有自己的file1.x副本,因此对另一个进行修改将不会显示在另一个进程中。

答案 1 :(得分:0)

您正在调用两个不同的jvm进程。这两个流程都有自己的file1file2副本。其他过程不会看到一个过程中静态变量的变化。

答案 2 :(得分:0)

  

我将运行杀死iostat.java中的进程的killjava,并且在杀死之前我需要执行一个操作

您可以使用关机挂钩执行此操作。

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 29490@plus-dev-01
stats
stats
stats
stats
stats
Final stats

在另一个窗口中运行kill 29490后,最后一行出现了。


  

我将如何为两个不同的流程做到这一点

这是一个复杂的答案,有太多可能的解决方案。 (共享内存,JMS,RMI,信号,套接字,IPC等)

一般来说,这是作为高级概念完成的,例如“停止过程”而不是“递增x”,即使结果是相同的。

问题在于,作为一个高级主题,您需要很好地理解进程间通信才能理解完整的答案。

简单的解决方案是;不要这样做,找到另一种方法来做你想做的事。