我正在开发一个用 Java 编写的网络服务器。 Web 服务器正在处理与客户端的 websocket 通信,因此我们有一个名为 ClientHandler 的类,它有一个套接字和 id 作为实例变量。 ClientHandler 需要有一个函数来监听来自客户端的消息。该函数需要与服务器的其余部分并行工作,并且由于“读取消息”是一个线程阻塞函数,因此我们需要一个单独的线程。
这是实现此目的的两种替代方法:
public class ClientHandler implements Runnable{
//Instance variable
public Thread listener = new Thread(this);
.
.
.
public void run() {
while (!Thread.interrupted()){
//Listening code here
}
}
}
然后通过编写启动监听器线程
clientHandler.listener.start();
并通过写来停止它
clientHandler.listener.interrupt();
或者这个方法:
public class ClientHandler {
//Instance variable
private Thread listenerTread;
private boolean alive; //set to true in constructor
.
.
.
public void listenToClient() {
listenerTread = new Thread(new Runnable() {
@Override
public void run(){
while (!alive){
//Listening code here
}
}
});
}
}
然后通过调用函数listenToClient()启动线程
clientHandler.listenToClient();
并通过切换alive = false来停止它。
我试图找人解释最佳解决方案,但大多数比较是在实现 Runnable 或扩展 Thread 之间进行的。使用上述任何一种方法有什么缺点吗?如果我想在一个类中拥有多个线程,哪种方法最好?
最佳答案
我不确定您是否想要显式创建一个 Thread 实例。为什么不尝试使用 ThreadPoolExecutor 来提交任务以供执行。在这里阅读有关线程池的更多信息。 http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html
由于您可以拥有许多客户端,因此使用线程池可以提高应用程序的性能。
关于java - 哪种线程实现方式最有利?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22712564/