设置"标志" Java

时间:2016-07-20 20:43:50

标签: java multithreading sockets java-threads

我有一个连接到服务器的类,如下所示。

@Override
public void run() {
    while (running) {
        try {
            msgHandler.log("Connecting to " + host + ":" + port);
            Socket s = new Socket(host, port);

            if (s.isConnected() && !s.isClosed()) {
                msgHandler.connectionInit(s);
            }
            BufferedInputStream input = new BufferedInputStream(s.getInputStream());

    }
}

作为msgHandler的使用者,如果连接断开,则经常轮询套接字。

@Override
public void connectionInit(Socket s) throws IOException {
    logger.info("Connected to AWW Service on " + configuration.getAwwHost() + ":" + configuration.getAwwPort());

    output = new BufferedOutputStream(s.getOutputStream());

    connector.componentReady();
    Timer t = new Timer();
    t.schedule(new TimerTask() {
        @Override
        public void run() {
                try {
                    pollServer();
                } catch (IOException e) {
                    // SOCKET GETS BROKEN HERE 
                }
        }
    }, 0, 25000);

}

问题是,如何在套接字连接被破解回run()线程时从异常中进行通信,以便它可以尝试重新初始化套接字和输入流?

我不认为这里的notify()或wait()机制是合适的,因为wait()只会让run()线程进入休眠状态。 我在想什么相当于在连接断开时设置标志,run()线程不断检查标志,当它设置为true时,它重新初始化套接字。但我相信,为了实现这一目标,将有一种更有效的多线程方法来实现这一目标。

2 个答案:

答案 0 :(得分:0)

我认为最简单的方法是使用两个线程都可以访问的AtomicBoolean变量 - 如果需要,可以在构造每个线程的run类时传递变量。关于AtomicBoolean的好处是它已经是线程安全/同步和可变的,因此它可以传递并通过引用进行修改。

有关详细信息,请参阅此similar question

答案 1 :(得分:0)

我认为在 run()函数中,你应该有一个类似下面的代码。

// ...
try
{
    // ...
    int read = input.read(...);
    // ...

}
catch (IOException e)
{
    // TODO: terminate the thread and restart a new connection
}

因此,如果在 pollServer()调用期间发生错误,我上面的代码也会产生异常。

同样,当您调用close对象的Socket函数时,输入和输出流将生成相对异常。