Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 哪种实现线程的方式最有利?_Java_Multithreading_Sockets - Fatal编程技术网

Java 哪种实现线程的方式最有利?

Java 哪种实现线程的方式最有利?,java,multithreading,sockets,Java,Multithreading,Sockets,我正在使用Java编写的Web服务器。web服务器正在处理与客户端的websocket通信,因此我们有一个名为ClientHandler的类,该类将套接字和id作为实例变量。ClientHandler需要有一个函数来监听来自客户端的消息。这个函数需要与服务器的其余部分并行工作,因为“读取消息”是一个线程阻塞函数,所以我们需要一个单独的线程来完成这个任务 以下是实现此功能的两种可选方法: public class ClientHandler implements Runnable{ //Inst

我正在使用Java编写的Web服务器。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();
通过写作来阻止它

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()启动线程

并通过切换alive=false来停止它


我试图找人解释最佳解决方案,但大多数比较是在实现Runnable或扩展线程之间进行的。使用上述任何一种方法都有缺点吗?如果我想在一个类中有多个线程,哪种方法最好?

我不确定您是否要显式创建线程实例。为什么不尝试使用ThreadPoolExecutor来提交要执行的任务呢。在这里阅读更多关于线程池的信息


由于您可以有许多客户端,因此使用线程池可以提高应用程序的性能。

您有两个任务。一种是监听新的连接并启动该连接的服务。第二是实际服务于连接。在单独的线程中为每个连接提供服务的决定是第二个任务的实现细节。原则上,它可以通过其他方式提供,使用线程池或异步IO。因此,这个实现细节应该隐藏在第二个任务的代码中,并且不能对第一个任务的代码可见。所以请使用第二种方法。

您实际上没有回答这个问题:问题是关于程序设计的原则,而不是性能。