Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多线程服务器是如何工作的?_Java_Android_Multithreading_Synchronization - Fatal编程技术网

Java 多线程服务器是如何工作的?

Java 多线程服务器是如何工作的?,java,android,multithreading,synchronization,Java,Android,Multithreading,Synchronization,我从安卓上的多线程服务器的某个人那里得到了这个示例: 但我在理解部分代码时有一些困难: while(! isStopped()) { Socket clientSocket = null; try { clientSocket = this.serverSocket.accept(); } catch (IOException e) { if (isStopped()) { System.out.println("

我从安卓上的多线程服务器的某个人那里得到了这个示例:

但我在理解部分代码时有一些困难:

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()
之间建立连接,以及“同步”是什么


希望我已经澄清了我的不诚实!提前感谢你:)

你可能已经离开了,但为了子孙后代

当我在这一行遇到异常时会发生什么

如果您在accept中得到异常,则不会返回套接字,因此没有要关闭的内容。
accept()
返回一个您应该处理然后关闭的有效套接字,或者抛出异常。决不能两者兼而有之

哪里调用了
stop()

Stop看起来是由某个想要关闭服务器套接字的调用方从外部世界调用的。对于服务器,您创建一个服务器套接字,然后接受到远程客户端的单独连接,这将返回该客户端的套接字。每个客户端处理程序都需要关闭各自的连接。当服务器关闭时(在本例中,当调用
stop()
时),服务器套接字将关闭

调用
stop()
后,服务器套接字关闭,
accept()
方法将抛出异常。这就是为什么会有一个
if(isStopped())
签入代码以避免引发异常

如何在
isStopped()
onStop()之间建立连接

isStopped()
是一个私有方法,用于测试是否有人调用了
stop()
方法。我假设
onStop()
是一种Android方法?虽然有人可能想调用
singleThreadedServer.stop()
onStop()内部,但它们之间没有关联

同步的
是怎么回事

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


在我看来,同步那个私有方法真是太糟糕了。我认为这样做是为了确保
isStopped
已经更新。我会使用
volatile
boolean或
AtomicBoolean
来代替。

while(true)不会耗尽电池,因为accept()会等待连接,并会“暂停”线程,直到有人尝试连接(或直到有人关闭它,在这种情况下会引发异常)。但是isStopped()是否会在内部调用stop()?我只做功能体中的事情,其他什么都不做。总之,我已经看过了您提供的链接,它似乎解释得很好。我建议您运行、调试和破解代码,看看它是如何运行的。对于同步所做的事情,请看这里:当调用stop时,将完成两件事情。首先是将ISSTuped布尔值定位为true,这将在所有情况下防止while再次循环。第二条语句是this.serverSocket.close(),它告诉系统您的进程不再侦听请求(顺便说一句,它将释放一些分配给打开的服务器的资源)。调用server.stop()后,将无法输入任何连接,此.serverSocket.accept()将引发异常,因为它无法再接受这些连接。
clientSocket = this.serverSocket.accept();