Java 仅使一个正在运行的线程执行catch块?

Java 仅使一个正在运行的线程执行catch块?,java,multithreading,Java,Multithreading,我有一个多线程Java程序,有时它会抛出一个异常,需要对我的网络设置进行一些更改。我面临的问题是,所有正在运行的线程都试图这样做,这会导致问题。有没有办法让运行中的线程只执行catch块中的代码 这是我的接球台 catch (ElementNotFoundException e) { System.out.println("Element not found!"); e.printStackTrace();

我有一个多线程Java程序,有时它会抛出一个异常,需要对我的网络设置进行一些更改。我面临的问题是,所有正在运行的线程都试图这样做,这会导致问题。有没有办法让运行中的线程只执行catch块中的代码

这是我的接球台

        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;                               
            }
        }
    }
}