Java的Main方法与Java进程之间的关系

Java应用程序的入口就是main方法()!

启动一个Java应用程序,就是要运用它的main方法,这时候就启动了一个Java虚拟机------在Windows下查看任务管理器,就会发现多出了一个javaw.exe的进程,这个就是java虚拟机!而main()方法其实是Java虚拟机这个进程的一个主线程(默认至少还有一个垃圾回收器的守护线程,所以运行一个java应用程序,启动了一个java进程的同时,至少又启动了2个java线程)!main方法执行结束,java虚拟机自动就销毁了,进程就结束啦!

所以,我们同时运行了2个java类的main()方法,这时候操作系统会启动2个java进程。

但是,Java进程间是不能直接通信的------除非采用JMS,WebService等技术,给外部调用程序一个接口!(这就是Java的安全性啦)

例如:

public class Test1 {
public static int num = 10;

public static void main(String[] args) {
while (true) {
System.out.println("-------num-----" + num);
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

运行Test1类,会每隔10秒打印它的成员变量num值!

我们写一个java程序,来修改它的它的成员变量num值

public class Test2 {
public void changeNum() {
Test1.num = 100;
}

public static void main(String[] args) {
Test2 t = new Test2();
t.changeNum();
System.out.println("num=====" + Test1.num);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

运行后会发现,Test1类中打印的num值根本没有变化!!!!很简单,因为它们是2个java应用程序,不可能直接通信!

有人会怀疑:是否可以在Test1类中添加一个静态方法,修改num值,然后让外部类调用,这样来改变num的值-------答案是不行的!具体深入的理解,就需要了解Java虚拟机的运行机制啦!

//================================================================

关于Java进程通信,这是个很值得研究的问题;先看看传统的进程间通信的手段有什么,无外乎还是以下的这些手段:
(1) 管道(PIPE)
(2) 命名管道(FIFO)
(3) 信号灯(Semphore)
(4) 消息队列(MessageQueue)
(5) 共享内存(SharedMemory)
(6) Socket(当然也有Socket)

如果加上上面提到的临时文件(临时文件其实是很难处理的,不同的进程间单靠临时文件可以交互信息,但是做到进程的调度控制确是很费力的事情,当然也不是不能做到),而首选的通信方法就是Socket通信!

参考:http://topic.csdn.net/t/20031209/18/2545703.html

http://sungyi.javaeye.com/blog/392813

没有更多推荐了,返回首页