退出一个线程将关闭所有

时间:2015-04-20 19:31:27

标签: java multithreading swing

我有一个带有菜单的java应用程序。其中一个菜单项是Exit。其定义如下:

    item_exit.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {        
            System.exit(0);
        }
    });

另一个菜单项是New,它使同一程序的另一个实例(?)并行运行。它的定义如下:

    item_new.addActionListener(new ActionListener() {          
            MyApp app = new MyApp(); 
            app.start();
        }
    });

除了一个问题外,它可以按预期工作。当我关闭其中一个时,它们都关闭了。整个应用程序构建在一个JFrame对象上。我不认为更改它的默认关闭操作会有所帮助。我认为问题出在system.exit(0)上。但是,解决这个问题的替代方法是什么?我只希望关闭的线程关闭,而不是全部关闭。感谢。

6 个答案:

答案 0 :(得分:1)

创建一个对象并调用其start()方法并不能使另一个程序并行运行。它只在同一个JVM中创建一个对象,并在同一个JVM中执行其start()方法。

System.exit()退出JVM,因此在此JVM中运行的所有内容都将停止运行。

要使JFrame不可见,请在其上调用setVisible(false)。这不会阻止JVM。

答案 1 :(得分:0)

System.exit(0);使整个Java机器退出,并运行其中的所有内容。尽量不要使用它,除非你真的需要这样做。

对于退出,也许请尝试检查此How to close a Java Swing application from the code

答案 2 :(得分:0)

System.exit(0)退出完整的程序,而不仅仅是当前的线程。如果要退出线程,则有两个选项:一旦相应的Runnable run()方法完成,线程就会自动退出,或者您可以使用thread.stop()终止线程(只是为了完整性,不应该使用。)

答案 3 :(得分:0)

请阅读System.exit()的文档。它明确指出:

  

终止当前运行的Java虚拟机。

这意味着JVM将终止,并且所有线程都将终止。

答案 4 :(得分:0)

System.exit(0)关闭整个JVM。 您的两个实例在同一个JVM上运行:您不要分叉进程,只需创建MyApp类的另一个实例。所以很明显,两个应用程序"将会被杀死。

您应该向要关闭的JFrame发送终止信号,而不是调用System.exit(0)

frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));

这样,只有JFrame(或"应用程序")才会被杀死。

另一种选择是分叉一个全新的过程。为此,我建议您查看Process类。

答案 5 :(得分:0)

基本上,您需要更改“退出”的操作,以便能够检测到当前正在运行的另一个“应用”...并在这种情况下做一些合理的事情。也许你警告用户其他活动还没有完成,并警告他如果他真的想现在退出,其他活动将被放弃。也许你以一种完全独立的方式启动其他活动,因此无关紧要。有几个不错的选择,所以这真的成为您的设计决定:什么策略对您和您的用户最直观的感觉?