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