我们有一个漫长的运行过程(用JAVA编写),这花了很多时间来完成整个执行。因此,我们决定通过将进程从单线程转换为多线程来提高性能。
因此我们决定使用Spring Reactor并通过实现Spring Reactor(1.1.3.RELEASE)将整个过程转换为多线程。
实施后,提高了性能,实现了我们最初寻找的目标。
但经过1周的测试,我们发现了两个主要问题。
1) 螺纹卡住问题 : 我们已经创建了总共3个反应堆,其池大小为5,这意味着3个反应堆是并行的每个线程大小为5执行。
2) java.lang.ArrayIndexOutOfBoundsException
java.lang.ArrayIndexOutOfBoundsException:0 at com.gs.collections.impl.set.mutable.UnifiedSet.copyToArray(UnifiedSet.java:1992) at 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) at com.gs.collections.impl.set.mutable.UnifiedSet.toList(UnifiedSet.java:1330) at com.gs.collections.impl.collection.mutable.AbstractUnmodifiableMutableCollection.toList(AbstractUnmodifiableMutableCollection.java:590) 在 reactor.event.registry.CachingRegistry.select(CachingRegistry.java:131) at reactor.event.dispatch.AbstractLifecycleDispatcher.route(AbstractLifecycleDispatcher.java:67) at reactor.event.dispatch.AbstractMultiThreadDispatcher $ MultiThreadTask.run(AbstractMultiThreadDispatcher.java:89) at reactor.event.dispatch.WorkQueueDispatcher $ 3.onEvent(WorkQueueDispatcher.java:89) at reactor.event.dispatch.WorkQueueDispatcher $ 3.onEvent(WorkQueueDispatcher.java:86) 在com.lmax.disruptor.WorkProcessor.run(WorkProcessor.java:138) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615) 在java.lang.Thread.run(Thread.java:745)
这个问题不会经常出现,但我们在一周内面临这样的1到2次。即使我们有不错的服务器配置,我也无法找到解决这个问题的方向。
任何人都可以帮我解决这个问题。请分享你的想法。