Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 - Fatal编程技术网

Java中多线程的替代方案

Java中多线程的替代方案,java,multithreading,Java,Multithreading,我有个问题困扰了我一会儿。 例如,我有一个多线程服务器,当它收到一个请求时,它将这个请求传递给一个处理程序,这个处理程序将处理这个请求。我们将服务器设置为多线程的一个原因是: 如果不是多线程的,则在服务器处理此请求时,在指定时间内, 另一个请求即将到来,则此请求将被删除,因为服务器现在不可用 所以我想知道是否有多线程服务器的替代方案,例如,我们可以为非多线程服务器创建一个队列?当它完成一个请求后可以从队列中获取另一个请求时。是的,您可以有一个。这个功能是由java.nio包提供的,尽管您可以使用

我有个问题困扰了我一会儿。 例如,我有一个多线程服务器,当它收到一个请求时,它将这个请求传递给一个处理程序,这个处理程序将处理这个请求。我们将服务器设置为多线程的一个原因是: 如果不是多线程的,则在服务器处理此请求时,在指定时间内, 另一个请求即将到来,则此请求将被删除,因为服务器现在不可用

所以我想知道是否有多线程服务器的替代方案,例如,我们可以为非多线程服务器创建一个队列?当它完成一个请求后可以从队列中获取另一个请求时。

是的,您可以有一个。这个功能是由
java.nio
包提供的,尽管您可以使用类似的框架,而不是从头开始


但是,请注意,虽然这曾经被认为是获得更好性能的一种方法,但它看起来像是一个常规的多线程服务器,实际上与当今的硬件和操作系统配合使用。

是的,您可以。您是否考虑过技术(即技术)?你可能也想调查一下图书馆。在使用NIO时,它为您完成了大部分工作。

您仍然可以使用带有多线程服务器的单线程引擎

考虑以下框架——如果您有一个运行的引擎,它可以是完全单线程的,只需按照接收的顺序处理请求。这允许您在业务逻辑中使用非线程安全组件,并且您已经成功地将网络层与业务逻辑层分离!这是一个双赢的局面

class Engine implements Runnable {

    private final Object requestLock = new Object();
    private List<Request> requests = new LinkedList<Request>();
    private boolean running = true;

    private Request nextRequest() {
        synchronized(requestLock) { return requests.poll(); }
    }

    /**
     * The engine is single threaded. It doesn't care about server connections
     */
    public void run() {
        while(running) {
            Request request = nextRequest();
            // handle your request as normal
            // also consider making a mechanism to send Responses
        }
    }
}
类引擎实现可运行{
private final Object requestLock=新对象();
私有列表请求=新建LinkedList();
私有布尔运行=真;
私有请求nextRequest(){
已同步(requestLock){return requests.poll();}
}
/**
*引擎是单线程的。它不关心服务器连接
*/
公开募捐{
(跑步时){
请求=nextRequest();
//正常处理您的请求
/还考虑建立一种机制来发送响应。
}
}
}

如果请求者不需要同步回复,只需实现基本的消息查询服务即可。接收网络连接的组件仍然必须是多线程的,但它只是将请求数据过滤并转储到(FIFO)队列中。您有一个读卡器线程来从队列中取出最旧的消息进行实际处理。这种模型已经使用多年,在点对点消息传递系统中很常见。