使用线程创建套接字数组

时间:2014-02-11 13:10:26

标签: java multithreading sockets

我是Java的新手,试图理解套接字和线程。我创建了一个迷你聊天程序,但它使用:

private static Socket clientSocket = null;
private static final socketThread[] threads = new socketThread[maxClientsCount];

然后使用:

创建线程
//code
clientSocket = serverSocket.accept();
//code
for (i = 0; i < maxClientsCount; i++) {
    // If found create thread
    if (threads[i] == null) {
        (threads[i] = new socketThread(clientSocket, threads)).start();
        break;
    }
}
// if no available sockets available, say "too busy" and close

线程的类使用:

class socketThread extends Thread {
    public socketThread(Socket clientSocket, socketThread[] threads) {
        this.clientSocket = clientSocket;
        this.threads = threads;
        maxClientsCount = threads.length;
    }      

    public void run() {
        //code 
        chatproto = new chatprotocol();
        // code
    }
}

然后处理所有数据并将其传递给chatprotocol类,该类处理如何解释每个连接的输入并处理如何为每个连接提供输出。

这允许我使用以下方式访问每个套接字:

threads[i].chatproto.[insert method/variable]

访问每个套接字处理程序。

我一直在阅读也许我应该使用“implements runnable”代替,但是在转换我的代码时遇到了麻烦。在这种情况下使用“implements runnable”是否正确?如果我这样做,我该如何访问chatprotocol类的每个实例?

感谢。

2 个答案:

答案 0 :(得分:0)

通常使用“implemens runnable”是启动新线程的最佳方法。但是这个interace的想法与你的实现不同,因此转换代码显然很难 我们的想法是从实际线程中封装您的代码,因此您可以在其他步骤中重新运行它。这样做的问题是,您无权访问Runnable类 一种解决方案是将socketThread的每个实例注入其自己的chatproto对象。这看起来像是

class socketThread implements Runnable {  
//code  
    chatproto = null;  
    public static socketThead (chatprotocol chatproto) {  
        this.chatproto = chatproto;  
    }  
// code  
}

答案 1 :(得分:0)

正如user3297516所指出的,“实现runnable”始终是最好的启动线程。但由于它是一个接口,因此无法正常创建它的实例。要创建实例,您必须创建一个匿名内部类。例如:

    class InnerRunnable2 {
    private int countDown = 5;

    private Thread t;

    public InnerRunnable2(String name) {
    t = new Thread(new Runnable() {
    public void run() {
    while (true) {
      System.out.println(this);
      if (--countDown == 0)
        return;
      try {
        Thread.sleep(10);
      } catch (InterruptedException e) {
        throw new RuntimeException(e);
      }
    }
  }

  public String toString() {
    return Thread.currentThread().getName() + ": " + countDown;
  }
}, name);
t.start();

}   }