繁体   English   中英

套接字接受和多个线程

[英]Socket accept and multiple threads

我有这个问题,我不知道该如何解决,我处于精神错乱的边缘。 编程,是吗? :/

无论如何,我有一台服务器,该服务器有一个线程可以向用户发送它需要的所有信息(需要不断运行),还有一个线程正在等待新的服务器连接。 我的问题是,一旦socket.accept() ,其他线程就不会执行。

所以,用代码来解释:

class Thread1 extends Thread {


  public void run() {
    while(true)
    {
      s=socket.accept();
    }
  }

class Thread2 extends Thread {

  public void run() {
    //do stuff
    System.out.println("spam");
  }
}

  public static void main(String[] args)
  {
    Thread1 t1 = new Thread1();
    t1.start();

    t1.Thread2 t2 = t1.new Thread2();
    t2.start();
  }
}

假设所有其他必需的成员变量都存在,没有编译错误并且连接功能正常。 只是“ Thread2”仅执行一次。

所以我的问题是,我该如何解决这个问题?

提前致谢,

蒂姆

一些建议

  • 永远不要扩展线程,因为这是混淆自己的好方法。 除非您真的很喜欢混淆,否则切勿在另一个线程中嵌套一个线程。
  • 如果要为每个套接字运行一个线程,则为循环中的每个套接字创建一个新线程。

请尝试以下操作(注意:您可以添加IOException处理代码)

class SocketAcceptor implements Runnable {
    public void run() {
        while(true) {
            Socket s=socket.accept();
            SocketHandler sh = new SocketHandler(s);
            new Thread(sh).start();
        }
    }
}

class SocketHandler implements Runnable {
    final Socket s;
    SocketHandler(Socket s) { this.s = s; }
    public void run() {
        System.out.println("New connection " + s);
        s.close();
    }

}

更好的解决方案是使用线程池。 例如ExecutorService,但我首先要使它工作。

我认为您对线程有基本的误解。 让我们看看是否可以清除它。

线程只是执行的另一条管道。 将它们视为具有特定说明集的任务 任务完成后,线程将返回。 很简单的主意,对吧?

在您的示例中, Thread1有一个无限循环,这意味着它确实可以无限运行并且可以无限期地接受客户端。

但是, Thread2只是输出一些文本并返回。 没有什么告诉它“ 保持旋转 ”。

在您main()即使Thread2是一个内部类的Thread1 (这是一种不好的形式,首先,我想补充),它实际上并没有强制线程继续运行。

您可能需要向服务器类添加一个Queue以容纳新的套接字,并Thread2具有Thread2循环并检查条目。

进一步阅读

首先,看一下Thread 它的构造函数使用一个Runnable ,因此在使用线程时您应该执行的所有操作(即, class Foo implements Runnable ,然后再class Foo implements Runnable new Thread(new Foo()) )。

如果您喜欢套接字,那么您可能会从中获得更多有关套接字服务器体系结构甚至协议设计的信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM