Java线程:无法创建新线程并终止/中断旧线程
我是java线程的新手,我刚刚在一个小组项目中遇到了一个问题: //编辑:该程序是一个JFrame,需要某种“重新启动”来加载属性文件更改。 我们有一个程序,您可以在其中更改某些属性。 为了使更改生效,程序需要使用新的JVM重新启动/重新启动(在我看来是吗?) 问题如下: 我已经创建了一个线程,它实际启动了我们的程序,稍后,更改将触发程序创建一个新线程。这是工作,但我无法杀死旧线程。如果我尝试这样做(“X”或编程),我会同时杀死这两个实例。 所以实际上没有两个线程否则他们应该被分开对待,不是吗 另一方面,当使用Java线程:无法创建新线程并终止/中断旧线程,java,multithreading,restart,Java,Multithreading,Restart,我是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()
这在测试用例中起作用:我的新线程/程序是否会覆盖第一个线程/程序释放的内存?我必须确保没有机会从这个旧线程/帧获取数据。