Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以访问另一个线程吗';从不同的线程获取Java中的资源?_Java_Multithreading_Rabbitmq_Connection - Fatal编程技术网

我可以访问另一个线程吗';从不同的线程获取Java中的资源?

我可以访问另一个线程吗';从不同的线程获取Java中的资源?,java,multithreading,rabbitmq,connection,Java,Multithreading,Rabbitmq,Connection,在这种情况下,我希望访问处于等待或阻塞状态的线程,并破坏它们与外部服务器的连接。这是否可以在不生成存储这些连接的全局变量的情况下实现?我可以从Java中的另一个线程访问这些连接对象吗 更具体地说: 我与RabbitMQ服务器建立了连接,该服务器在达到特定的内存阈值时会限制连接,在我的例子中,该阈值已经达到。因此,客户端挂起等待RabbitMQ服务器解除阻止,这在我的用例中是永远不会发生的。所以,我想关闭这些特定的连接。我曾尝试向这些线程发送中断,但这些线程似乎无法识别中断,并且一直处于挂起状态。

在这种情况下,我希望访问处于等待或阻塞状态的线程,并破坏它们与外部服务器的连接。这是否可以在不生成存储这些连接的全局变量的情况下实现?我可以从Java中的另一个线程访问这些连接对象吗

更具体地说:


我与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();