【发布时间】:2026-02-14 23:35:01
【问题描述】:
我是套接字编程的新手,正在尝试编写一个简单的命令行聊天应用程序。 现在我使用下面的代码来接受一个连接,然后为它创建一个新线程,但是没有创建新线程,并且不支持一个以上的客户端(这在不使用线程时很常见),
public class chatserver extends Thread{
public static Socket client;
public static void main(String a[]) throws Exception{
ServerSocket srv = new ServerSocket(4444);
if((client = srv.accept())!=null){
new newthread(client);
}
}
}
class newthread extends Thread{
private Socket client;
public newthread(Socket client){
super("chatchild");
this.client = client;
start();
}
为什么没有创建线程?我在“oracle.com”上引用了示例,其中一个包含相同的代码,但我无法弄清楚会发生什么以及何时发生的确切顺序???sn- p 来自接受连接并创建线程的示例代码::
while (listening)
new KKMultiServerThread(serverSocket.accept()).start();
现在这里的监听是 bool var sat 为 true 但它在代码中的任何地方都不会设置为 false。???这是如何工作的?
【问题讨论】:
-
您具体关注了哪些示例?你的类派生自
Thread而不是简单的使用Thread来完成他们的工作,这对我来说似乎非常奇怪。 -
还有一件事.. 不要在构造函数中启动线程。这是不安全的,因为这个线程可以看到一个非完全构造的对象。
-
@sarnold 我正在关注link 的示例,\
-
果然one of their examples does exactly what I think is so strange。我希望教程作者清楚地说明什么是为了方便而不是生产代码的正确方式。
-
@buch11:您的代码在
newthread的构造函数中启动了一个新线程。这可能导致该线程看到构造不完整的newthread对象。相反,您应该在构造函数返回后调用start()。有关详细信息,请参阅ibm.com/developerworks/java/library/j-jtp0618/index.html。
标签: java multithreading sockets