gpt4 book ai didi

java - 多线程服务器如何工作?

转载 作者:行者123 更新时间:2023-12-01 15:52:42 24 4
gpt4 key购买 nike

我从某人那里得到了这个例子,在 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() 之间建立联系... .“同步”是什么意思?

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

最佳答案

您可能已经继续前进,但为了子孙后代......

what happens when I have an exception at this line

clientSocket = this.serverSocket.accept();

如果您在accept内部遇到异常,则不会返回套接字,因此无需关闭任何内容。 accept() 返回一个您应该处理的有效套接字,然后关闭它抛出异常。永远不要两者兼而有之。

where is stop() called?

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

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

how it gets to make the connection between isStopped() and onStop()

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

what is with that synchronized?

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

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

在我看来,同步该私有(private)方法确实很糟糕。我认为这样做是为了确保 isStopped 已更新。我会使用 volatile boolean 值或 AtomicBoolean 来代替。

关于java - 多线程服务器如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5693199/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com