我有几个关于并发架构和性能的问题。
安装:
有一个JavaFX GUI,用户可以启动各种任务,这些任务本身是线程任务(
问题:
这些任务需要很长时间,瓶颈似乎是等待HTTP响应的延迟。(DB插入使用关闭自动提交的方法进行批量处理,每次处理10k个准备好的插入语句)
目标:
通过将请求放在单独的任务/线程中来提高整体性能。
Q1:
在这里使用线程是否合理?我如何以其他方式提高性能?
Q2:
如果线程合理,我该如何实现它?我想过使用全局线程池或
Q3:
如何确定良好的线程池大小?如何区分线程?
我已经阅读了一些关于多线程的评论,它们都说拥有比核心更多的线程并不一定会提高性能(没有“真正”的并发,时间片分配)。我不知道但如果我必须猜测,我会说数字13包括一些GUI线程。我似乎无法理解如何获得ThreadPoolSize的有用数量。
感谢您对我的应用程序提供的任何提示。
安装:
有一个JavaFX GUI,用户可以启动各种任务,这些任务本身是线程任务(
new Thread(new CustomTask<?>).start()
)。这些任务执行循环约700k HTTP请求,并在准备好的插入语句中有大约10k个项目时插入处理后的返回值到数据库中。它们的进度在GUI(ObservableList
项目)中显示。问题:
这些任务需要很长时间,瓶颈似乎是等待HTTP响应的延迟。(DB插入使用关闭自动提交的方法进行批量处理,每次处理10k个准备好的插入语句)
目标:
通过将请求放在单独的任务/线程中来提高整体性能。
Q1:
在这里使用线程是否合理?我如何以其他方式提高性能?
Q2:
如果线程合理,我该如何实现它?我想过使用全局线程池或
ExecutorService
将请求任务排队。当响应可用时,将其写入同步列表。如果列表中有10k +对象,则执行批量插入。Q3:
如何确定良好的线程池大小?如何区分线程?
Thread.activeCount()
返回7(当前线程组)
ManagementFactory.getThreadMXBean().getThreadCount()
返回13(线程总数?)
Runtime.getRuntime().availableProcessors()
返回8我已经阅读了一些关于多线程的评论,它们都说拥有比核心更多的线程并不一定会提高性能(没有“真正”的并发,时间片分配)。我不知道但如果我必须猜测,我会说数字13包括一些GUI线程。我似乎无法理解如何获得ThreadPoolSize的有用数量。
感谢您对我的应用程序提供的任何提示。