只使用其中一个正在运行的线程来执行catch块?

时间:2014-01-07 02:28:19

标签: java multithreading

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

这是我的阻止

        catch (ElementNotFoundException e)
        {
            System.out.println("Element not found!");
            e.printStackTrace();
            IpManager.changeDSLIp();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

3 个答案:

答案 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”布尔值必须是静态的/通常也被引用。