Java 如何在多线程环境中共享2个SSH连接

Java 如何在多线程环境中共享2个SSH连接,java,multithreading,ssh,Java,Multithreading,Ssh,目前我有一个ExecuterService,我向它提交多个线程。这些线程之间共享一个SSH连接。 线程在SSH连接上获得锁(以执行某些命令),其余线程等待 现在我想优化性能,并在这些线程之间使用2个SSH连接。 为了实现,我认为我必须将我的线程分为2个部分,并共享它们之间的2个连接。 我正在寻找是否有更合适的方法来做到这一点。 提前感谢您的回复 我已经完成了POC,得出结论,2个SSH连接在并行执行环境中可以正常工作。如果一个线程使用SSH连接的时间是固定的,那么将线程分成两部分是可以接受的。否

目前我有一个ExecuterService,我向它提交多个线程。这些线程之间共享一个SSH连接。 线程在SSH连接上获得锁(以执行某些命令),其余线程等待

现在我想优化性能,并在这些线程之间使用2个SSH连接。 为了实现,我认为我必须将我的线程分为2个部分,并共享它们之间的2个连接。 我正在寻找是否有更合适的方法来做到这一点。 提前感谢您的回复


我已经完成了POC,得出结论,2个SSH连接在并行执行环境中可以正常工作。

如果一个线程使用SSH连接的时间是固定的,那么将线程分成两部分是可以接受的。否则它可能不是最优的,因为您可以让一个部分在另一个部分之前结束其处理,并且其中一个连接可用且不使用

从理论上看,许多客户端需要访问多个服务器,这是一个问题。您的描述是拥有与服务器一样多的队列,每个客户机在一个队列上等待。这并不愚蠢,而且是在现实世界中超市结账时使用的。但是,如果一个人看到一个队列是空的,而他们的队列不是空的,那么他就有足够的智慧来改变队列。。。好的一点是,实现起来很简单

另一种可能是使用单个队列,一旦服务器可用,它就会向调度程序点发送信号,该调度程序点会将其发送给第一个客户机。这提供了最佳的等待时间重新分区。在现实世界中,它通常用于计数器很少的管理服务中。缺点是实现起来稍微复杂一些。它可以通过一个用于客户端的队列、一个用于可用服务器的队列(或堆栈)以及一个在服务器可用之前阻止下一个客户端的信号量来实现


对于简单的短任务,第一种方法可能是最好的,因为第二种算法提供的增益可能不足以弥补由于更高的复杂性而损失的时间。否则,您仍然可以在更复杂的algo的开发(和维护)成本与效率更低但更简单的algo之间取得平衡。

如果一个线程使用SSH连接的时间是固定的,则可以将线程分成两部分。否则它可能不是最优的,因为您可以让一个部分在另一个部分之前结束其处理,并且其中一个连接可用且不使用

从理论上看,许多客户端需要访问多个服务器,这是一个问题。您的描述是拥有与服务器一样多的队列,每个客户机在一个队列上等待。这并不愚蠢,而且是在现实世界中超市结账时使用的。但是,如果一个人看到一个队列是空的,而他们的队列不是空的,那么他就有足够的智慧来改变队列。。。好的一点是,实现起来很简单

另一种可能是使用单个队列,一旦服务器可用,它就会向调度程序点发送信号,该调度程序点会将其发送给第一个客户机。这提供了最佳的等待时间重新分区。在现实世界中,它通常用于计数器很少的管理服务中。缺点是实现起来稍微复杂一些。它可以通过一个用于客户端的队列、一个用于可用服务器的队列(或堆栈)以及一个在服务器可用之前阻止下一个客户端的信号量来实现


对于简单的短任务,第一种方法可能是最好的,因为第二种算法提供的增益可能不足以弥补由于更高的复杂性而损失的时间。否则,您仍然可以在更复杂的算法的开发(和维护)成本与效率较低但更简单的算法之间取得平衡。

创建
阵列锁定队列q
。让线程在需要通信时执行
conn=q.take()
,完成后执行
q.put(conn)
。在开始时,将两个连接都放到该队列。

创建一个
阵列锁定队列q
。让线程在需要通信时执行
conn=q.take()
,完成后执行
q.put(conn)
。在开始时,将两个连接都放到该队列。

感谢您的响应,我确实考虑了连接池,但在我的例子中,它似乎不是必需的,因为线程将执行类似的命令集,这将花费与以前相同的时间。因此,让连接对象处于空闲状态的可能性非常小。那么我的建议是从简单的线程分区开始,并在日志文件中跟踪每个部分的结束时间。而且只要不时地分析日志,看看实现一个真正的连接池是否值得。我肯定会这样做。感谢您的响应,我确实考虑了连接池,但在我的情况下,它似乎不是必需的,因为线程将执行类似的一组命令,这将花费与以前相同的时间。因此,让连接对象处于空闲状态的可能性非常小。那么我的建议是从简单的线程分区开始,并在日志文件中跟踪每个部分的结束时间。只要不时地分析日志,看看实现一个真正的连接池是否值得,我一定会这么做。