java - 哪种线程实现方式最有利?

标签 java multithreading sockets

我正在开发一个用 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/

相关文章:

javascript - Ratpack 无法从 body 中检索值(value)

java - 如何在 Java 中更改 JTable 的网格线宽度?

linux - 如何在 linux 的 openmpi 中启用多线程标志?

c - 如何保证 64 位写入是原子的?

c - 为什么 lsof 显示奇数​​套接字?

java - 如何修复java中的 "java.net.SocketException"错误

java - 枚举类型和字符串

java - 使用ant时出现NoClassDefFoundError

android - 使用位置更新会影响主线程

C++ int 通过套接字 send() : differnent value in TCP package on Linux/MacOS