Java:一个子进程可以杀死父进程吗?

3
在下面的代码片段中,ParentClass启动Controller然后隐藏。希望能够在jMenuItemExitActionPerformed上终止ParentClass。回想起来,我应该反转Parent/Child关系,但这将是一个很大的变化。有更简单的方法吗?
public class ParentClass extends javax.swing.JFrame {
    private void processC() {
        JFrame controller = new Controller();
        this.setVisible(false);
        ...
public class Controller extends javax.swing.JFrame {
    private void jMenuItemExitActionPerformed(java.awt.event.ActionEvent evt) {                                                   
        System.exit(0);
        ...

不,matricide和patricide是非法的。 - flarn2006
3个回答

2
最简单的方法是像这样传递对父级的引用:
public class ParentClass extends javax.swing.JFrame {
    private void processC() {
        JFrame controller = new Controller(this);
        this.setVisible(false);
        ...
public class Controller extends javax.swing.JFrame {
    private ParentClass parent;
    public Controller(ParentClass parent) {
        this.parent = parent;
    }
    private void jMenuItemExitActionPerformed(java.awt.event.ActionEvent evt) {                                                   
        parent.exit(); // or whatever
        System.exit(0);
        ...

这不会造成循环引用吗(父->子->父...)?在ParentClass中添加一个公共静态退出似乎可以解决问题。 - jacknad
@JackN:你不需要担心循环引用,它不会造成任何伤害。垃圾回收器足够聪明,可以解决这个问题。 - Skip Head

1
在ParentClass中添加一个公共静态退出,就像这样似乎可以工作。
public class ParentClass extends javax.swing.JFrame { 
    private void processC() { 
        JFrame controller = new Controller(); 
        this.setVisible(false); 
        ... 
    public static void exit() {
        System.exit(0);
  ...
public class Controller extends javax.swing.JFrame { 
    private void jMenuItemExitActionPerformed(java.awt.event.ActionEvent evt) {
        ParentClass.exit(); 
        ... 

如果你的exit()方法只调用System.exit(0),那么你可以保留原始代码而不会出现任何问题。System.exit(0)将关闭VM并自动删除您的ParentClass。 - Skip Head

1

反转父子关系是更简单的方法。如果你不这样做,你将花费大量时间和精力来解决这个问题,而后悔当初没有正确地处理它。你应该总是按照你知道的方式构建事物。时间成本是完全值得的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接