Java 多线程与单线程

Java 多线程与单线程,java,concurrency,Java,Concurrency,我现在正在开发一个服务器-客户机应用程序(只是为了学习),并试图获取有关该应用程序中线程的设计决策的信息 目前我有一个线程负责客户端的所有非阻塞io。当它接收到任何数据时,它会将其发送给工作线程,该工作线程用这些字节创建一个“指令集”,然后相应地对其进行操作。然而,根据指令集,它可以作用于任意数量的数百个对象(每个对象将限制在2到12个可以与其交互的客户机之间)。我试图弄清楚是否应该在同一个线程上处理所有指令集,并在处理每个指令集时阻塞,或者是否应该为每个对象创建单独的线程,然后将每个接收到的指

我现在正在开发一个服务器-客户机应用程序(只是为了学习),并试图获取有关该应用程序中线程的设计决策的信息

目前我有一个线程负责客户端的所有非阻塞io。当它接收到任何数据时,它会将其发送给工作线程,该工作线程用这些字节创建一个“指令集”,然后相应地对其进行操作。然而,根据指令集,它可以作用于任意数量的数百个对象(每个对象将限制在2到12个可以与其交互的客户机之间)。我试图弄清楚是否应该在同一个线程上处理所有指令集,并在处理每个指令集时阻塞,或者是否应该为每个对象创建单独的线程,然后将每个接收到的指令集传递给给定的对象线程进行处理

我的问题归结为,与一个工作线程处理所有数据(并在处理每个指令集时阻塞)相比,在什么情况下(如果有的话),有更多等待数据的非活动线程会降低系统的速度

如果我为每个对象创建了一个单独的线程,那么我认为它可以提高并发性,因为一旦主工作线程创建了一个指令集,它就可以将其传递给处理,并且可以直接开始处理下一个指令集

然而,我一直听说创建和管理线程会带来潜在的成本,因为操作系统必须管理线程。因此,如果我为一个对象创建了一个线程,该线程最多可以有两个客户端与之交互,那么管理它的潜在成本是否会抵消它的并发好处,也就是说只有两个客户端可以利用该并发性


和往常一样,任何建议/文章都非常感谢:)

我建议遵循JavaEE应用服务器设置的示例

有一个用于传入请求的队列和一个用于处理程序线程的池。当请求传入时,让控制器从池中取出一个处理程序线程,将请求从队列中取出,并将其交给处理程序线程处理。线程完成后,将其放回池中

如果请求的数量大于处理程序线程的数量,则队列允许它们累积并等待线程可用

这种设计有两个好处:

  • 它允许您设置处理程序线程池的大小,并将其与服务器资源相匹配
  • 当传入的请求超过池容量时,它会限制它们,这样您就不会阻塞、等待或丢失请求

  • 并发性是您在这里的朋友。它将有助于保持服务器的可伸缩性

    我建议遵循JavaEE应用程序服务器设置的示例

    有一个用于传入请求的队列和一个用于处理程序线程的池。当请求传入时,让控制器从池中取出一个处理程序线程,将请求从队列中取出,并将其交给处理程序线程处理。线程完成后,将其放回池中

    如果请求的数量大于处理程序线程的数量,则队列允许它们累积并等待线程可用

    这种设计有两个好处:

  • 它允许您设置处理程序线程池的大小,并将其与服务器资源相匹配
  • 当传入的请求超过池容量时,它会限制它们,这样您就不会阻塞、等待或丢失请求

  • 并发性是您在这里的朋友。它将有助于保持服务器的可伸缩性

    如果线程实际上处于休眠状态,那么开销成本应该不超过启动线程的成本。休眠线程有一种相当有效的方法,可以在需要之前一直保持休眠状态:等待中断。(注意,睡眠的一种常见方法是在时钟中断后醒来,这是您可以指定它应该睡眠的时间量的方式)。如果这些线程没有利用硬件,因为它们是从计时器之类的东西而不是程序特定的东西中醒来的,那么处理器将被迫进行的所有上下文切换的开销可能是天文数字,最明显的是清空缓存。

    如果线程实际上处于睡眠状态,管理费用不应超过最初启动它们的成本。休眠线程有一种相当有效的方法,可以在需要之前一直保持休眠状态:等待中断。(注意,睡眠的一种常见方法是在时钟中断后醒来,这是您可以指定它应该睡眠的时间量的方式)。如果这些线程没有利用硬件,因为它们是从计时器之类的东西而不是程序特定的东西中醒来的,那么处理器将被迫进行的所有上下文切换的开销可能是天文数字,最明显的是清空缓存。

    每种方式都进行测试。有时你必须阻塞,除非你确信自己的计算能力,否则你不能把所有东西都用ram存储。机器速度越慢/性能越差,需要的阻塞就越多。将应用程序设计为可根据情况进行调整。更好的办法是让它跟踪正在发生的事情,并让它自行调整。

    每种方法都要进行测试。有时你必须阻塞,除非你确信自己的计算能力,否则你不能把所有东西都用ram存储。机器速度越慢/性能越差,需要的阻塞就越多。将应用程序设计为可根据情况进行调整。更好的是让它跟踪正在发生的事情,并让它自己调整。

    这是一个比我预想的更优雅的解决方案。谢谢:)这是一个比我想象的更优雅的解决方案。谢谢:)虽然休眠线程的cpu成本不算什么,但如果有大量的线程,内存成本可能会很高