我有一种情况,我想访问处于等待或阻塞状态的线程并破坏它们与外部服务器的连接。如果没有创建存储这些连接的全局变量,这是否可行?我可以从Java中的另一个线程访问这些连接对象吗?
更具体一点:
我与RabbitMQ服务器建立了连接,当它达到特定的内存阈值时会限制连接,在我的情况下它达到了这个阈值。因此,客户端挂起等待RabbitMQ服务器解除阻塞,这在我的用例中永远不会发生。所以,我想关闭那些特定的联系。我曾尝试向这些线程发送中断,但似乎这些线程无法识别中断并且无限期地被挂起。
答案 0 :(得分:1)
资源不属于线程,例如,Java并不关心哪个线程具有对Socket
对象的引用。
您需要一个中央ConcurrentHashMap<Thread, Socket>
或类似内容才能使您的连接对象对外部可见。或者您可以中断线程并让它们终止连接,因为几乎所有等待/阻塞的事情都会在您执行此操作时抛出InterruptedException
。
因此,如果您知道它是thread
,它通常类似于
Socket socket = connectionMap.get(thread);
socket.close();
或
thread.interrupt();
与
之类的线程代码一起使用Thread myThread = Thread.currentThread();
connect();
while(!myThread.isInterrupted()) {
try {
doStuff();
} catch (InterruptedException e) {
myThread.interrupt(); // exception does not set interrupted state
}
}
disconnect();