我有一个使用线程池使用多线程的Java程序。每个线程都会做出一些选择和插入语句。该数据库是MySQL InnoDB。

我计划启动几个运行屏幕(6个进程),并且每个进程都将使用多线程。我的问题是:

1)我可以为池定义多少个线程?由于我的处理器是Core i7-2640M,我最多只能限制4个线程吗?

2)我应该担心任何有关数据库完整性的问题吗?我没有对程序中的任何内容使用同步(不需要),但是我担心数据库插入语句。我是否需要同步它们,否则MySQL会知道在主函数中每个进程都有一个连接,因此会对此加以照顾。

请给我提意见。

最佳答案

关于线数

如果愿意,单个内核上可以有100个线程。操作系统将schedule它们运行,因此每个操作系统都有一定的运行时间。运行中的计算机已经有数百个活动线程/进程,其中大多数处于空闲状态(Windows任务管理器在某处显示该信息)。

CPU中的每个内核一次只能运行1个线程。 i7-2640M有两个物理核心,但是每个都有超线程(=在“并行”中的1个物理核心上运行2个线程),因此它提供了4个核心供您使用。

要估算最佳线程数,您需要知道线程的活跃程度。如果每个线程一直在不休眠/等待的情况下运行,则它将占用一个完整的内核。在这种情况下,您不应使用超过4个线程,因为它们只会互相阻塞。在活动线程之间切换需要CPU花费一些时间,因此更多线程将导致整体性能下降。

如果线程正在等待,则需要计算活动百分比。例如。每个屏幕线程大部分时间都在等待用户输入。每个输入需要1秒钟来处理,您希望每个屏幕每分钟将获得30个事件。这意味着您每分钟大约需要30秒。您每分钟有4 x 60秒,因此最佳线程/屏幕数约为8。

如果您有一个执行程序来运行小任务,每一个任务都在几秒钟内完成,那么使用的线程数与内核数一样多。执行程序可以将小任务分配给线程,这样您就可以为每个内核恢复大约100%的负载。

关于Db完整性

参见Eugen Rieck。事务是确保原子修改的方式(=其他进程看不到事务开始和结束之间的状态)

10-08 09:45