Java线程:无法创建新线程并终止/中断旧线程

Java线程:无法创建新线程并终止/中断旧线程,java,multithreading,restart,Java,Multithreading,Restart,我是java线程的新手,我刚刚在一个小组项目中遇到了一个问题: //编辑:该程序是一个JFrame,需要某种“重新启动”来加载属性文件更改。 我们有一个程序,您可以在其中更改某些属性。 为了使更改生效,程序需要使用新的JVM重新启动/重新启动(在我看来是吗?) 问题如下: 我已经创建了一个线程,它实际启动了我们的程序,稍后,更改将触发程序创建一个新线程。这是工作,但我无法杀死旧线程。如果我尝试这样做(“X”或编程),我会同时杀死这两个实例。 所以实际上没有两个线程否则他们应该被分开对待,不是吗

我是java线程的新手,我刚刚在一个小组项目中遇到了一个问题:

//编辑:该程序是一个JFrame,需要某种“重新启动”来加载属性文件更改。

我们有一个程序,您可以在其中更改某些属性。 为了使更改生效,程序需要使用新的JVM重新启动/重新启动(在我看来是吗?)

问题如下:

我已经创建了一个线程,它实际启动了我们的程序,稍后,更改将触发程序创建一个新线程。这是工作,但我无法杀死旧线程。如果我尝试这样做(“X”或编程),我会同时杀死这两个实例。 所以实际上没有两个线程否则他们应该被分开对待,不是吗

另一方面,当使用
Thread.currentThread().interrupt()
时,这两个实例都将保留,但我不能做任何事情

螺纹起动器:

public static void createNewInstance() {
prog = new Runnable() {
        @Override
        public void run() {
            try {
                 //loading propertie data into String[] array..
                 Start.main(String[] array);
                 while (true)  {
                        if (!isRunning) {
                            currentThread().interrupt();
                            createNewInstance();
                            isRunning = !isRunning;
                        }
                 }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    };
    new Thread(prog).start();
}
在变革活动中:

        MyThread.isRunning = false;
        Thread.currentThread().interrupt();
因为这对我来说是新的,我不知道我应该如何做到这一点,我感谢迄今为止我所做的任何建议和错误。 (对任何错误表示抱歉-我不是以英语为母语的人)

提前谢谢

----解决方案:----

在我的例子中,属性更改与一个新的语言设置有关:DE->EN
我的留言:
公共类消息{
私有静态字符串bundle_name=“com.ttr.language.messages”+新属性类().getProperty(“lang”);/$NON-NLS-1$
私有静态ResourceBundle resource\u bundle=ResourceBundle.getBundle(bundle\u name);

然后我将此方法添加到Messages类:

publicstaticvoidupdateproperties(字符串语言){
bundle_name=“com.ttr.language.messages”+语言;
resource\u bundle=ResourceBundle.getBundle(bundle\u名称);
}

并在我的程序中使用它:


props.setProperty(“lang”、“EN”);
假设XThread是实现功能的线程。触发更改时,可以调用
terminateThread()
停止以前运行的线程,并调用
getInstance()
以使用新属性运行新线程

 class XThread implements Runnable{

        private static Thread rT = null;
        private XThread()
        {}
        public static void terminateThread()
        {
            rT = null;
        }

        public static Thread getInstance()
        {
            if(rT==null)
            {
                rT = new Thread(new XThread());
            }
            return rT;
        }

        public void run()
        {
         //whatever functionality you want to add
        }
    }

希望这有帮助:)

您实际上中断了当前线程,而不是预期会中断的线程。您需要在
createNewInstance()中创建的线程实例
正确中断。另外,我很确定您不需要线程自行中断。您只需允许它离开可运行的线程体,此时它将正常停止。您好,感谢您的快速回复!我是否必须将它一直传递到更改事件?我们有很多类…或者我可以执行类似的操作<代码>getInstanceOf(MyThread).currentThread()?不,不。中断的目的是实际中断可能在某个长时间运行的任务中的线程,您不想等待完成。对于您的简单情况,您只需将
isRunning
设置为volatile,并注释掉所有中断,我很确定。之后,您将需要查看不同的等待通知模式,等等,看看有什么以及如何进一步改进代码。好的,我已经理解为什么我应该使用
volatile
,但是我的问题是-,抱歉没有提到-
Start.main(String[]数组)
在当前的更改事件中是一个jframe/panel/jdialog,不会就此结束。我有点无能为力,我想…嗨,谢谢你。也许我做错了什么,但我不能让它工作。如果我使用像
public void run(){System.out.println(“开始”);Thread.sleep(5000);System.out.println(“退出”)这样的东西;terminateThread();
它就像一个符咒,在打印退出后立即终止。但是,如果我试图启动我的程序而不是第一个
System.out.println(“start”);
它运行程序,运行
线程.sleep()
但以后不要终止我的程序..?像这样试试吧..请原谅我的缩进不正确。您是否使用
SwingUtilites.invokeLater()
来运行GUI代码。我使用
invokeLater()时有一个有用的链接
我使用了您的pastebin代码…启动时,会创建新框架,旧线程可能会停止,但旧框架仍然存在。如何摆脱旧框架?
dispose()
在此项目中不适用于我,并且
系统。退出(0)
杀死了整个JVM…很抱歉,但我仍然不知道如何摆脱这个旧框架,但保持新框架的活力..感谢您的耐心和迄今为止的帮助!如果我使用
dispose()
这在测试用例中起作用:我的新线程/程序是否会覆盖第一个线程/程序释放的内存?我必须确保没有机会从这个旧线程/帧获取数据。