线程中的Java线程

线程中的Java线程,java,multithreading,threadpool,executor,Java,Multithreading,Threadpool,Executor,我有一个将标题和详细信息数据插入数据库表的应用程序(2个表1用于标题信息,1个用于详细信息)。我目前的方法是在线程中平均分配细节。标题将包含平均100000个详细信息 我想改变处理多个标题的方法。我将把1头的逻辑封装在一个函数中(这个函数将包含多线程的细节),并在几个线程(头的数量)或线程池(使用执行器)中调用这个函数 这是解决这一问题的最佳方式还是有解决这一问题的最佳实践?为线程设置优先级也会影响线程的流吗?(我将为标题设置更高的优先级,并保留默认的详细信息)考虑到您描述的问题的性质,应用程序

我有一个将标题和详细信息数据插入数据库表的应用程序(2个表1用于标题信息,1个用于详细信息)。我目前的方法是在线程中平均分配细节。标题将包含平均100000个详细信息

我想改变处理多个标题的方法。我将把1头的逻辑封装在一个函数中(这个函数将包含多线程的细节),并在几个线程(头的数量)或线程池(使用执行器)中调用这个函数


这是解决这一问题的最佳方式还是有解决这一问题的最佳实践?为线程设置优先级也会影响线程的流吗?(我将为标题设置更高的优先级,并保留默认的详细信息)

考虑到您描述的问题的性质,应用程序的主要瓶颈可能是数据库I/O。这应该首先解决。一些常见做法:

  • 考虑数据库事务的粒度:如果在一个事务中分组多个详细信息插入,将比一次插入一个详细信息(在自动提交模式下会发生这种情况)获得更好的性能
  • 使用并优化数据库连接池,这样就可以让多个线程同时执行数据库操作,而不会给数据库服务器带来太多负担
  • 请记住,DB操作大多是I/O绑定的,因此您可能会使用比核心更多的线程
  • 如果适用,请使用执行器服务,而不是创建自己的线程,这样您就不必自己管理线程的生命周期

您认为您从多线程中获得了优势吗?是否有足够的CPU工作来分配多个线程?听起来单线程方法在这里更简单、更有效。为线程设置优先级也不太可能给您带来任何好处。是的,我忘了提到每个标题平均包含100000个详细信息。我目前使用的一个头的方法已经提高了我的性能。我不明白如果只是将数据插入数据库,为什么需要多线程。有CPU工作要做吗?你是否正确地分批插入数据?是的,我的数据是对xml进行解组的结果,我需要先将一些业务规则应用于结果对象,然后将数据插入到它们各自的表中,我在不同的阶段有几个db调用,并调用一个shell文件。嗯,首先,您应该使用执行器和其他更高级别的构造(因此,不要创建自己的
线程
类或摆弄优先级)。我会分离线程,这样您就有了处理线程和一个在数据库中插入的线程。它们之间有一个
BlockingQueue
,用于传递要插入数据库的处理数据。通过这种方式,您可以测试哪些线程有用(在处理阶段),哪些线程不太有用(在DB插入阶段),并相应地调整执行器的大小。