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