套接字接受和多个线程

时间:2014-05-06 17:12:54

标签: java multithreading sockets

我有这个问题我不知道如何解决,我处于疯狂的边缘。编程,嗯? :/

无论如何,我有一个服务器,它有一个线程向用户发送它需要的所有信息(需要不断运行)和另一个等待新服务器连接的线程。我的问题是一旦调用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'只执行一次。

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

提前致谢,

2 个答案:

答案 0 :(得分:3)

一些建议

  • 永远不会扩展线程,因为它是一个混淆自己的好方法。除非你真的喜欢混淆,否则永远不要将Thread嵌套在另一个Thread中。
  • 如果你想为每个套接字运行一个线程,那么为循环中的每个套接字创建一个新线程。

尝试以下操作(注意:您可以添加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,但我会先让它工作。

答案 1 :(得分:3)

我认为你对线程有一个基本的误解。让我们看看我们是否可以解决这个问题。

线程只是另一个执行管道。将它们视为具有特定指令集的任务。任务完成后,线程返回。非常简单的想法,对吧?

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

但是,Thread2只输出一些文字并返回。没有什么可以告诉它继续旋转'。

main()内,即使Thread2Thread1的内部类(这是一种糟糕的形式,我可以添加),它实际上并没有强制线程继续运行。

您可能希望在包含新套接字的服务器类中添加Queue,并Thread2循环并检查条目。

进一步阅读

首先,看看Thread class。它的构造函数需要Runnable,因此在处理线程时应该实现所有这些(即class Foo implements Runnable然后new Thread(new Foo()))。

如果您喜欢套接字,那么套接字 - 服务器架构上的某些further reading甚至协议设计都可能会让您受益匪浅。