Java 如何在两个线程之间进行双向消息传递

Java 如何在两个线程之间进行双向消息传递,java,multithreading,threadpool,Java,Multithreading,Threadpool,我有一个非线程安全的第三方MyService类,我有一个相同的问题,但有一个区别:我需要提交Callables notRunnables 如果使用常规的ThreadPoolExecutor,我会这样做: ExecutorService executor = Executors.newFixedThreadPool(8); // later in another thread Future<String> result = executor.submit(() -> {

我有一个非线程安全的第三方
MyService
类,我有一个相同的问题,但有一个区别:我需要提交
Callable
s not
Runnable
s

如果使用常规的
ThreadPoolExecutor
,我会这样做:

ExecutorService executor = Executors.newFixedThreadPool(8);
// later in another thread
Future<String> result = executor.submit(() -> {
     // compute return value then return it
     return computed value
})
ExecutorService executor=Executors.newFixedThreadPool(8);
//稍后在另一个线程中
未来结果=执行者提交(()->{
//计算返回值,然后返回它
返回计算值
})
然后,我会等待未来的结果,以获得callable的结果

但是,ExcutoService没有办法将对象与每个线程相关联,并且上面的问题的答案不考虑工作者线程需要回传给提交任务的线程。

使用
ThreadLocal
在关机阶段有明显的缺点,我想到了一个线程ID到他们需要的结果的映射,但是
ConcurrentHashMap
没有提供阻止当前线程等待添加密钥的方法,而且这个问题并没有给我一个好的答案:BlockingQueue不是我这里需要的,并且链接的
BlockingMap
库非常旧


那么,我如何实现我想要的呢?

我找到了一种方法,这个解决方案取自
执行者
jdk实现代码。简而言之,我们使用
Future
与请求线程通信,如下所示:

class Task<T> extends CompletableFuture<T>
// in worker thread
MyService service = new MyServiceImpl();
while(!!Thread.currentThread().isInterrupted()){
     Task<T> task = blockingQueue.take();
     T result = ... // compute result
     task.complete(result)
}
// in request thread
Task<T> newTask = new Task<>();
blockingQueue.put(newTask)
return newTask.get() <--- ofcourse you can do others things with the future
类任务扩展了CompletableFuture
//在工作线程中
MyService service=newmyservicecimpl();
而(!!Thread.currentThread().isInterrupted()){
Task=blockingQueue.take();
T result=…//计算结果
任务完成(结果)
}
//请求线程中
任务newTask=新任务();
blockingQueue.put(newTask)

return newTask.get()是否尝试将某种线程安全对象传递给可调用的构造函数?这样,你就可以得到计算结果。@rowing ghoul我无法传递线程安全的对象,我还需要线程池中的线程拥有
MyService
对象,而不是在连接线程中创建它并将其传递给。@rowing ghoul和我需要在启动时为每个线程创建多个对象,而不是在来自连接线程的每个请求中创建这些对象