多线程服务器如何工作?

时间:2011-04-17 11:21:01

标签: java android multithreading synchronization

我已经从这个带有多线程服务器的例子中获得了android:

http://tutorials.jenkov.com/java-multithreaded-servers/singlethreaded-server.html

但是我在理解部分代码时遇到了一些困难:

while(! isStopped()) {
    Socket clientSocket = null;
    try {
        clientSocket = this.serverSocket.accept();
    } catch (IOException e) {
        if (isStopped()) {
            System.out.println("Server Stopped.") ;
            return;
        }
        throw new RuntimeException("Error accepting client connection", e);
    }

我不明白的是,当我在这一行有异常时会发生什么:

clientSocket = this.serverSocket.accept();

据我所知,这个函数被调用:

private synchronized boolean isStopped() {
    return this.isStopped;
}

但如何关闭该套接字?如果您在尝试接受客户端时遇到异常,则应该关闭accept返回的套接字。

我认为这是在这里完成的:

public synchronized void stop() {
    this.isStopped = true;
    try {
        this.serverSocket.close();
    } catch (IOException e) {
        throw new RuntimeException("Error closing server", e);
    }
}

stop()在哪里被调用,如何在isStopped()onStop()之间建立联系....那么“同步”是什么?

希望我已经清楚我的不清楚了!提前谢谢你:)

1 个答案:

答案 0 :(得分:1)

你可能已经离开了,但后人......

  

当我在此行有例外时会发生什么

clientSocket = this.serverSocket.accept();

如果在accept中出现异常,则不会返回任何套接字,因此无法关闭任何内容。 accept()返回应该处理的有效套接字,然后关闭它会引发异常。从来没有。

  

在哪里调用stop()

一些想要关闭服务器套接字的调用者从外部调用停止看起来。使用服务器,您可以创建服务器套接字,然后接受与远程客户端的单独连接,这将返回该客户端的套接字。每个客户端处理程序都需要关闭自己的各个连接。当服务器关闭时(在这种情况下调用stop()时),服务器套接字将关闭。

调用stop()后,服务器套接字将关闭,accept()方法将引发异常。这就是为什么在代码中进行if(isStopped())检查以避免抛出异常。

  

如何在isStopped()onStop()

之间建立联系

isStopped()是一个私有方法,用于测试某人是否调用了stop()方法。我假设onStop()是Android方法?虽然有人可能想在singleThreadedServer.stop()内拨打onStop(),但它们并不相关。

  

synchronized是什么?

synchronized线程程序将synchronized关键字用作互斥锁和内存屏障。它只允许1个线程一次在synchronized块内执行。它还确保所有局部变量在线程和中央内存之间同步。请参阅java docs:

  

http://download.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html

让私有方法同步真的是IMO。我认为这样做是为了确保isStopped已更新。我会使用volatile布尔值或AtomicBoolean代替。