Java 回调函数时的多线程处理

Java 回调函数时的多线程处理,java,multithreading,Java,Multithreading,好的,这可能是一个很大的问题 我有一个服务(比如notifier)和该服务的方法[比如notifyTransaction(Transaction trans)]中的一个可远程用于回调 现在还有另一个服务,比如(TransactionReader),它不断读取传入的事务,并调用通知程序的远程方法,即notifyTransaction(Transaction)。 现在,为了向您解释这个问题,我想补充一点,我的事务包含多个操作。对于治疗手术,我有一个功能,即processOperation(操作op)

好的,这可能是一个很大的问题

我有一个服务(比如notifier)和该服务的方法[比如notifyTransaction(Transaction trans)]中的一个可远程用于回调

现在还有另一个服务,比如(TransactionReader),它不断读取传入的事务,并调用通知程序的远程方法,即
notifyTransaction(Transaction)。

现在,为了向您解释这个问题,我想补充一点,我的事务包含多个操作。对于治疗手术,我有一个功能,即
processOperation(操作op)。

processOperation(Operation op)
实际上对数据库进行了一些更新

有什么问题吗? service TransactionReader以非常快的速度读取传入的事务,并调用
notifyTransactions()
,其速度远远高于通过
processOperation(Operation op)
方法处理操作的速度

我想做什么? 我想在
notifyTransactions()
中使用多线程,以便有多个线程来处理每个事务

开始时我用
ExecutorService executor=Executors.newFixedThreadPool(2)
在方法
notifyTransactions()
中,创建了我的方法processOperation(操作op)的任务。但这会为每次调用
notifyTransactions()
创建一个不同的池,所以我在几秒钟内就有大约3000个池。最后,它失去了记忆

还有什么其他可能的解决方案

提前感谢:)

对于启动,我使用ExecutorService executor=Executors.newFixedThreadPool(2);在方法notifyTransactions()中

这是您需要的
ExecutorService
实例在这两个方面都是通用的问题。如果您开始调用每个操作,那么它将创建大量线程。您只需在
notifyTransactions()中调用
submit
task

您应该使用生产者-消费者方法,使用有界的。所以,若队列已满,生产者将停止,若队列为空,消费者将停止。
所以在您的例子中,
processOperation(Operation op)
是一个生产者,它将处理操作并将其放入BlockingQueue和
notifyTransactions()中
您将对其进行出列并进行相应的处理。

+1如果您想要注入自己的阻塞队列,那么您应该直接实例化
ThreadPoolExcutor
:新的ThreadPoolExecutor(nThreads,nThreads,0L,TimeUnit.mills,new LinkedBlockingQueue(1000))是。但他每次调用threadpool都犯了一个大错误。正如您所说,它只需要像这样调用一次。