java - 如果我从多个线程使用 JSch,我应该如何使用它

标签 java ssh concurrency jsch

由于连接创建占用了很多时间,而且我想连接到多个主机,所以我开始从多线程使用 JSch。

但是我遇到了一些讨厌的异常,我认为这是因为 JSch 不是线程安全的。我应该如何使用它,它不会抛出任何异常,这是由于 JSch 的非线程安全性造成的?

堆栈跟踪:

com.jcraft.jsch.JSchException: connection is closed by foreign host
    at com.jcraft.jsch.Session.connect(Session.java:269)
    at com.jcraft.jsch.Session.connect(Session.java:183)
    at com.ericsson.eea.ark.test.common.ssh.JschSshContext.session$lzycompute(JschSshContext.scala:64)

更新:在我的测试中,我多次连接到同一个主机。这就是我得到异常(exception)的原因。

最佳答案

与任何其他非线程安全类一样。

一次只能从一个线程访问它。

使用synchronized语句:
https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

如果这会降低性能,您可以创建一个连接池。


虽然我不认为这个异常是由并发访问引起的。

而是服务器拒绝来自同一主机的过于频繁的连接尝试(这很常见)。

关于java - 如果我从多个线程使用 JSch,我应该如何使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38915200/

相关文章:

java.security.AccessControlException : access denied ("java.lang.RuntimePermission" "loadLibrary.jpcap")

git - 多个 ssh key 不起作用

c# - 如何使用异常处理创建永无止境的 DataFlow Mesh?

java - Java : what's the point? 中的 Thread.interrupt()

java - 用于检索最后执行的 SQL 语句的 DB2 系统运行时表

java - 使用 jSTL 生成 xml 的最佳方法

java - 用于提取学校卡中姓名的正则表达式

git - SSH 注册机 "no such file or directory"

java - JSch 登录文件

c++ - 我是否需要在多线程环境中保护对 STL 容器的读取访问?