Java 线程:无法创建新线程并终止/中断旧线程
Java Threads: Unable to create new Thread and killing / interrupting old Thread
我是 java 线程的新手,我只是 运行 遇到了一个小组项目的问题:
//编辑:该程序是一个 JFrame,需要一种 "relaunch" 来加载属性文件更改。
我们有一个程序,您可以在其中更改某些属性。
为了使更改生效,程序需要使用新的 JVM 重新启动/重新启动(在我看来?)
问题如下:
我已经创建了一个线程,它实际上启动了我们的程序,稍后,更改将触发程序创建一个新线程。这是有效的,但我无法终止旧线程。如果我尝试这样做("X" 或以编程方式),我会同时杀死两个实例。
所以实际上没有 2 个线程? - 否则他们应该分开对待,不是吗?
另一方面,当使用 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
我的消息:
public class Messages {
private static String bundle_name = "com.ttr.language.messages" + new PropertiesClass().getProperty("lang"); //$NON-NLS-1$
private static ResourceBundle resource_bundle = ResourceBundle.getBundle(bundle_name);
然后我将这个方法添加到消息 class:
public static void updateProperties(String language) {
bundle_name = "com.ttr.language.messages" + language;
resource_bundle = ResourceBundle.getBundle(bundle_name);
}
并在我的程序中使用了它:
props.setProperty("lang", "EN");
<- 示例
Messages.updateProperties(props.getProperty("lang"));
//dispose window and start login
假设 XThread 是实现您的 functionality.When 的线程,您可以调用 terminateThread()
来停止前一个 运行ning 线程并调用 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
}
}
希望对您有所帮助:)
我是 java 线程的新手,我只是 运行 遇到了一个小组项目的问题:
//编辑:该程序是一个 JFrame,需要一种 "relaunch" 来加载属性文件更改。
我们有一个程序,您可以在其中更改某些属性。 为了使更改生效,程序需要使用新的 JVM 重新启动/重新启动(在我看来?)
问题如下:
我已经创建了一个线程,它实际上启动了我们的程序,稍后,更改将触发程序创建一个新线程。这是有效的,但我无法终止旧线程。如果我尝试这样做("X" 或以编程方式),我会同时杀死两个实例。 所以实际上没有 2 个线程? - 否则他们应该分开对待,不是吗?
另一方面,当使用 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
我的消息:
public class Messages {
private static String bundle_name = "com.ttr.language.messages" + new PropertiesClass().getProperty("lang"); //$NON-NLS-1$
private static ResourceBundle resource_bundle = ResourceBundle.getBundle(bundle_name);
然后我将这个方法添加到消息 class:
public static void updateProperties(String language) {
bundle_name = "com.ttr.language.messages" + language;
resource_bundle = ResourceBundle.getBundle(bundle_name);
}
并在我的程序中使用了它:
props.setProperty("lang", "EN");
<- 示例
Messages.updateProperties(props.getProperty("lang"));
//dispose window and start login
假设 XThread 是实现您的 functionality.When 的线程,您可以调用 terminateThread()
来停止前一个 运行ning 线程并调用 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
}
}
希望对您有所帮助:)