我可以访问另一个线程吗';从不同的线程获取Java中的资源?
在这种情况下,我希望访问处于等待或阻塞状态的线程,并破坏它们与外部服务器的连接。这是否可以在不生成存储这些连接的全局变量的情况下实现?我可以从Java中的另一个线程访问这些连接对象吗 更具体地说:我可以访问另一个线程吗';从不同的线程获取Java中的资源?,java,multithreading,rabbitmq,connection,Java,Multithreading,Rabbitmq,Connection,在这种情况下,我希望访问处于等待或阻塞状态的线程,并破坏它们与外部服务器的连接。这是否可以在不生成存储这些连接的全局变量的情况下实现?我可以从Java中的另一个线程访问这些连接对象吗 更具体地说: 我与RabbitMQ服务器建立了连接,该服务器在达到特定的内存阈值时会限制连接,在我的例子中,该阈值已经达到。因此,客户端挂起等待RabbitMQ服务器解除阻止,这在我的用例中是永远不会发生的。所以,我想关闭这些特定的连接。我曾尝试向这些线程发送中断,但这些线程似乎无法识别中断,并且一直处于挂起状态。
我与RabbitMQ服务器建立了连接,该服务器在达到特定的内存阈值时会限制连接,在我的例子中,该阈值已经达到。因此,客户端挂起等待RabbitMQ服务器解除阻止,这在我的用例中是永远不会发生的。所以,我想关闭这些特定的连接。我曾尝试向这些线程发送中断,但这些线程似乎无法识别中断,并且一直处于挂起状态。资源不属于线程,例如,Java不关心哪个线程引用了
套接字对象
您需要一个中央ConcurrentHashMap
或类似的东西,以使您的连接对象对外可见。或者您可以中断线程并让它们终止连接,因为几乎所有等待/阻塞的事情都会在执行此操作时抛出InterruptedException
s
所以,如果您知道它是哪个线程,它通常是
Socket socket = connectionMap.get(thread);
socket.close();
或
它将与线程代码一起使用,如
Thread myThread = Thread.currentThread();
connect();
while(!myThread.isInterrupted()) {
try {
doStuff();
} catch (InterruptedException e) {
myThread.interrupt(); // exception does not set interrupted state
}
}
disconnect();
非常感谢。虽然我发现这个答案绝对正确,但我的程序无法识别中断。我与RabbitMQ服务器有一个连接,该服务器在达到特定内存阈值时会限制连接,在我的例子中,该阈值已经达到。因此,客户端挂起等待RabbitMQ服务器解除阻止,这在我的用例中是永远不会发生的。所以,我想关闭这些特定的连接。但正如我所说,线程在Thread.isInterrupted()中显示为true,但通过将其放入try catch中,它仍然没有得到InterruptedException。@ArpanGupta您错过了一个通过不包含此信息(您特别想关闭RabbitMQ连接)来使问题更具体和可回答的好机会我会在描述中加上,谢谢@ErwinBolwidt,尽管我问这个问题的真正原因是关闭RabbitMQ连接,但除此之外,线程应该能够通过myThread.interrupt()被中断
Thread myThread = Thread.currentThread();
connect();
while(!myThread.isInterrupted()) {
try {
doStuff();
} catch (InterruptedException e) {
myThread.interrupt(); // exception does not set interrupted state
}
}
disconnect();