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();