Java 仅使一个正在运行的线程执行catch块?
我有一个多线程Java程序,有时它会抛出一个异常,需要对我的网络设置进行一些更改。我面临的问题是,所有正在运行的线程都试图这样做,这会导致问题。有没有办法让运行中的线程只执行catch块中的代码 这是我的接球台Java 仅使一个正在运行的线程执行catch块?,java,multithreading,Java,Multithreading,我有一个多线程Java程序,有时它会抛出一个异常,需要对我的网络设置进行一些更改。我面临的问题是,所有正在运行的线程都试图这样做,这会导致问题。有没有办法让运行中的线程只执行catch块中的代码 这是我的接球台 catch (ElementNotFoundException e) { System.out.println("Element not found!"); e.printStackTrace();
catch (ElementNotFoundException e)
{
System.out.println("Element not found!");
e.printStackTrace();
IpManager.changeDSLIp();
}
catch (Exception e)
{
e.printStackTrace();
}
您需要一个单一的中央服务来处理对网络设置的更改,这样您就可以防止同时进行多个更改,并且仍然可以提供合理的反馈。您的线程或更具体的异常处理代码需要将责任转移到此服务,并可能使用它来检查当前状态,以便以适当的方式处理异常(听起来线程必须等待新设置)。类似的操作可能会解决此问题
} catch (Exception e) {
synchronized (someCommonObject) {
if (!done) {
// do stuff
}
done = true;
}
}
someCommonObject可以是“this”,但前提是所有线程都由该对象处理。否则,拾取其他(可能是静态)对象。“完成”布尔值也必须是静态的/常用的引用。可以使用锁吗?信号灯?我们能看看你的代码吗?您可能需要一个有限状态机,或者只是一个同步块…请同步函数或块!捕获完成后,我需要将网络设置设置设置为false,对吗?如果问题再次出现,则需要重新执行catch块纠正。每个人(包括我自己)都建议使用静态对象。实际上,最好使用线程组上下文的本地对象,而不是真正的静态对象。通过这种方式,您可以让多个线程“组”独立且正确地运行。此外,由于这些将在操作“开始”时初始化,“完成”bool将初始化为false,而无需重置。是的,如果网络设置操作失败,则网络设置完成仍应为false。
//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;
}
}
}
}