好的,这可能是一个非常大的问题。
我有一个服务(例如通知程序),并且此服务的方法之一[例如notifyTransaction(Transaction trans)]可远程用于回调。
现在有其他服务说(transactionsReader)继续读取传入的事务并调用notifyTransaction(Transaction trans).
现在向您解释问题,我想补充一点,我的交易包含多个操作。对于处理操作,我有一个函数说processOperation(Operation op).
这个processOperation(Operation op)
实际上对数据库进行了一些更新。
问题是什么?
服务transactionsReader以非常快的速度读取传入的事务,并以比notifyTransactions()
方法处理操作的速度大得多的速度调用processOperation(Operation op)
。
我想做什么?
我想在notifyTransactions()
中使用多线程,以便我有多个线程来处理每个事务。
我开始使用
ExecutorService executor = Executors.newFixedThreadPool(2);
在方法notifyTransactions()
中创建了我的方法processOperation(Operation op)的任务。但这会为每次调用notifyTransactions()
创建一个不同的池,所以我在几秒钟内就有大约3000个池。最后它失去了记忆。
其他可能的解决方案是什么?
提前致谢:)
答案 0 :(得分:1)
为了开始,我使用了ExecutorService executor = Executors.newFixedThreadPool(2);在方法notifyTransactions()
中
这是您需要ExecutorService
个实例的问题。如果你开始调用每个操作,那么它将创建大量的线程。您应该在submit
notifyTransactions()
任务
您应该使用有限的BlockingQueue使用生产者消费者方法。因此,如果队列已满,则生产者将在队列为空时停止消费者将停止。
因此,在您的情况下,processOperation(Operation op)
是一个生产者,它将处理操作并将其放入BlockingQueue和notifyTransactions()
内部,您将对其进行出列并相应处理。