2012-10-11 66 views
0

好吧,这可能是一个非常大的问题。多线程同时回调函数

我有一个服务(说notifier)和方法[说notifyTransaction(Transaction trans)]这个服务远程可用于回调。

现在还有其他服务说(transactionsReader),它一直读取输入的交易,并调用了通知的远程方法是notifyTransaction(Transaction trans).

我们解释一下你的问题,我想补充一点,我的交易包含更多比一个行动。而对于治疗手术,我有一个功能说processOperation(Operation op).

processOperation(Operation op)实际上做了一些数据库更新。

最新问题? 服务TransactionsReader以非常快的速度读取传入的事务并以比processOperation(Operation op)方法处理操作的速度快得多的速度调用notifyTransactions()

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

开始我的方法notifyTransactions()使用 ExecutorService executor = Executors.newFixedThreadPool(2); 和创建我的方法processOperation(操作OP)的任务。但是,这会为每次拨打notifyTransactions()创建一个不同的池,因此我在几秒钟内就会有大约3000个池。最后它失去了记忆。

什么可能是其他可能的解决方案?

感谢提前:)

回答

1

为了启动我用ExecutorService的执行人= Executors.newFixedThreadPool(2);在方法notifyTransactions()

这是你需要的问题ExecutorService实例在两个都是通用的。如果你开始调用每个操作,那么它会创建大量的线程。您应该只需拨打submit任务notifyTransactions()

您应该使用生产者消费者方法,使用BlockingQueue这是有界的。所以如果队列满了,生产者将停止,如果队列为空,消费者将停止。 所以在你的情况processOperation(Operation op)是一个生产者,将处理操作,并把它放在BlockingQueue和notifyTransactions()里面,你将会出队并相应处理。

+0

+1如果你要注入自己的阻塞队列,那么你应该实例化'ThreadPoolExceutor'直接:'新的ThreadPoolExecutor(来确定nthreads,来确定nthreads,0L,TimeUnit.MILLISECONDS,新的LinkedBlockingQueue (1000));' – Gray

+0

是。但是他每次调用线程池都犯了一个很大的错误。正如你所说的那样,它只需要像这样调用一次。 –