1

我正在使用实现接口的第三方FooClientImplJava 类FooClient

interface FooClient {
    public FooOutput processFoo(FooInput inputData);
}

它通过特定端口号上的 TCP 套接字localhost与第三方非 Javafooserver进程进行通信来处理传递给它的数据。每个inputData实例都可以独立处理(即它是令人尴尬的并行)。fooserver相当慢,但只在一个核心上运行,所以我希望能够在单独的端口上手动启动它的多个实例,并有多个FooClientImpl实例来访问它——每个服务器实例一个。到目前为止,这很容易。

但是,我还想创建一个ConcurrentFooClientImpl也实现FooClient接口的类,但在后台,跟踪FooClientImpl实例池或子类实例(可能是 8 个),并在.processFoo()方法之后使用第一个未使用的实例处理传入数据调用(如有必要,等到可用)。这样,其他代码可以实例化ConcurrentFooClientImpl,并且它看起来与调用代码相同,只是更快。

我对线程很陌生,我已经浏览了Java Concurrency 教程,但是这个用例似乎与那里的示例有些不同。

我需要创建一个包装实例的Thread子类。而且我认为我还应该使用它来管理一个固定大小的客户端池,并且应该有一个生成. 然后我可以以某种方式包装一个实现,将它们提交到池中。但是这些实例需要获取一个特定的实例,以便它们可以依次调用并实际与适当端口上的运行进行对话。我他们可以打电话并将结果转换为FooClientImplThreadFooClientImplExecutors.newFixedThreadPoolThreadFactoryFooClientImplThreadConcurrentFooClientImpl.processFoo()inputDataCallableFooClientFooClientImplThread.processFoo()fooserverThread.currentThread()FooClientImplThread. 但直觉上这对我来说感觉很奇怪(虽然我不知道是否相信我的直觉),而且我不确定它是否会起作用或是否明智......

我在这里可能的解决方案是否走在正确的轨道上,还是我应该采取更理智的方法?

更新:我最终实施了一个像描述的解决方案。令人惊讶的是,它大部分都按预期工作,当然我意识到我没有考虑过在维护面向外部的 API 的同时后台处理需要什么。据我所知,这在我上面概述的一次调用者触发的 API 中是不可能的。它需要被生产者 - 消费者模式或其他东西取代,我最终这样做了,尽管方式不同。

4

1 回答 1

2

你把这个煮得太熟了。您所需要的只是对服务器的 TCP 部分进行多线程处理,即为每个接受的套接字启动一个新线程。然后这些线程可以共享同一个 FooImpl 对象,或者每个线程都有自己的一个,这取决于 FooImpl 的实现方式。您不需要新的线程类;你不需要任何东西。请注意,说任何 Java 对象仅在一个内核中运行是不正确的,除非您知道它是单线程的。

于 2013-01-08T07:39:21.720 回答