为啥不创建单独的线程?

Posted

技术标签:

【中文标题】为啥不创建单独的线程?【英文标题】:why the separate threads are not created?为什么不创建单独的线程? 【发布时间】:2011-07-03 01:34:09 【问题描述】:

我是套接字编程的新手,正在尝试编写一个简单的命令行聊天应用程序。 现在我使用下面的代码来接受一个连接,然后为它创建一个新线程,但是没有创建新线程,并且不支持一个以上的客户端(这在不使用线程时很常见),

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 【参考方案1】:

您必须不断调用 accept() 来创建其他线程:

public static void main(String a[]) throws Exception
    ServerSocket srv = new ServerSocket(4444);

    while (listening) 
        new newthread(srv.accept());
    

如果你想停止服务器,listening 变量应该设置为 false。

【讨论】:

【参考方案2】:

您的运行方法在哪里?如果没有 Thread 或 Runnable 中的 run 方法,我认为您的线程将无法执行任何操作。

【讨论】:

+1 - 更具体地说,它将执行默认的run 方法,该方法什么都不做......并且线程将立即终止。 我已经扩展了 Thread 超类,所以现在不需要实现 Runnable 接口,我可以使用 Thread 类本身的方法。 @Stephen C 嘿,我的程序中有 run() 方法,我只是没有发布该部分,因为不需要在一小部分时间内甚至没有生成线程... @buch11: true 并且答案已编辑,但您仍然需要 public static void run() 方法。那是哪里? @buch11 - IMO 问题出在您没有向我们展示的代码中。【参考方案3】:

最后我解决了问题,问题是 socket.accept() 方法在第一次客户端联系后没有保持活动状态...... run 方法没有任何问题,它是 socket.accept() 方法的属性...

【讨论】:

以上是关于为啥不创建单独的线程?的主要内容,如果未能解决你的问题,请参考以下文章

继承java.lang.Thread类并重写run方法为啥不可以创建一个新线程呢!为啥?

为啥win32线程不自动退出?

为啥 DAO 有单独的创建和更新方法?

Android为啥阿里Android开发手册中,线程池不建议使用Executors去创建?

即使我创建了两个单独的列表,为啥 if 条件为真

线程;创建一个单独的线程来定期做某事