我有一个多线程Java程序,有时会引发异常,需要对我的网络设置进行一些更改。我面临的问题是所有正在运行的线程都试图这样做,这会导致问题。有没有办法只使一个正在运行的线程执行catch块中的代码?
这是我的阻止
catch (ElementNotFoundException e)
{
System.out.println("Element not found!");
e.printStackTrace();
IpManager.changeDSLIp();
}
catch (Exception e)
{
e.printStackTrace();
}
答案 0 :(得分:1)
//Define a variable to indicate network settings has been done.
public static boolean NETWORK_SETTINGS_DONE = false;
public static Object LOCK = new Object();
public void doSometing() {
try {
} catch (Exception e) {
synchronized (LOCK) {
if (!NETWORK_SETTINGS_DONE) {
//do some changes to your network settings.
NETWORK_SETTINGS_DONE=true;
}
}
}
}
答案 1 :(得分:0)
您需要一个中央服务来处理网络设置的更改,以便您可以同时阻止多项更改,并仍然提供合理的反馈。您的线程或更具体的异常处理代码需要将责任转移到此服务,并可能使用它来检查当前状态以适当的方式处理异常(听起来线程必须等待新设置)。
答案 2 :(得分:0)
这样的事情可能会成功......
} catch (Exception e) {
synchronized (someCommonObject) {
if (!done) {
// do stuff
}
done = true;
}
}
someCommonObject可以是“this”,但仅当该对象正在处理所有线程时。否则选择一些其他(可能是静态的)对象。 “done”布尔值必须是静态的/通常也被引用。