我是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类的每个实例?
感谢。
答案 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();
} }