0

我们有一个长时间运行的进程(用 JAVA 编写),它需要花费大量时间来完成整个执行。因此,我们决定通过将进程从单线程转换为多线程来提高性能。

所以我们决定使用 Spring Reactor 并通过实现 Spring Reactor (1.1.3.RELEASE) 将整个过程转换为多线程。

实施后,提高了性能并实现了我们最初寻找的目标。

但是经过 1 周的测试,我们发现了两个主要问题。

1)线程卡住问题 我们总共创建了 3 个池大小为 5 的反应器,这意味着 3 个反应器并行执行,每个反应器的线程大小为 5。

2) java.lang.ArrayIndexOutOfBoundsException

java.lang.ArrayIndexOutOfBoundsException: 0 在 com.gs.collections.impl.set.mutable.UnifiedSet.copyToArray(UnifiedSet.java:1992) 在 com.gs.collections.impl.set.mutable.UnifiedSet.toArray(UnifiedSet.java :1972) 在 com.gs.collections.impl.utility.Iterate.toArray(Iterate.java:2558) 在 com.gs.collections.impl.list.mutable.FastList.newList(FastList.java:188) 在 com。 gs.collections.impl.set.mutable.UnifiedSet.toList(UnifiedSet.java:1330) 在 com.gs.collections.impl.collection.mutable.AbstractUnmodifiableMutableCollection.toList(AbstractUnmodifiableMutableCollection.java:590) 在reactor.event.registry.CachingRegistry.select(CachingRegistry.java:131) 在 reactor.event.dispatch.Abs​​tractLifecycleDispatcher.route(AbstractLifecycleDispatcher.java:67) 在 reactor.event.dispatch.Abs​​tractMultiThreadDispatcher$MultiThreadTask.run(AbstractMultiThreadDispatcher.java: 89) 在 reactor.event.dispatch.WorkQueueDispatcher$3.onEvent(WorkQueueDispatcher.java:89) 在 reactor.event.dispatch.WorkQueueDispatcher$3.onEvent(WorkQueueDispatcher.java:86) 在 com.lmax.disruptor.WorkProcessor.run(WorkProcessor .java:138) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 java.lang.Thread.run(线程.java:745)

这个问题并不经常出现,但我们每周会遇到 1 到 2 次。即使我们有不错的服务器配置,我也找不到解决这个问题的方向。

谁能帮我解决这个问题。请分享你的想法。

4

0 回答 0