Java 获取一个对象以将其自身从另一个类的列表中移除?

Java 获取一个对象以将其自身从另一个类的列表中移除?,java,arraylist,Java,Arraylist,我有一个“连接池处理程序”,在它的类中有一个“连接处理程序”的数组列表。我想知道当“连接处理程序”自己关闭连接时,是否有可能让它们从所述列表中删除它们自己,如果有,如何删除 public class ConnectionHandlerPool { private static final ArrayList<ConnectionThread> POOL = new ArrayList<ConnectionThread>; <code to get stuff ou

我有一个“连接池处理程序”,在它的类中有一个“连接处理程序”的数组列表。我想知道当“连接处理程序”自己关闭连接时,是否有可能让它们从所述列表中删除它们自己,如果有,如何删除

public class ConnectionHandlerPool
{
private static final ArrayList<ConnectionThread> POOL = new ArrayList<ConnectionThread>;

<code to get stuff out of pool>
公共类连接HandlerPool
{
私有静态最终ArrayList池=新ArrayList;
<从池中取出东西的代码>
连接线程类

public class ConnectionHandlerThread
{
<stuff that creates the connection>
<stuff that if exceptions occur i.e. a stream or socket closes it needs to close all the connections and remove from pool>
<that way of removing it from arraylist in the class above it>
公共类ConnectionHandlerThread
{

经过一番修补并与一些技术伙伴交谈,我已经解决了这个问题

  • 创建一个接口,其中包含一个采用ConnectionHandlerThread的方法
  • 让池实现所述接口,并让所述方法从arraylist中移除ConnectionHandlerThread
  • 通过创建名为addListener的方法,让连接处理程序池类将自身作为侦听器添加到ConnectionHandlerThread
  • 在线程中调用addListener并使其通过接口
  • 如果要删除interface.method,请从类中调用它

  • 实现这一点的最简单方法不需要复杂的侦听器设计,甚至不需要接口。注意:以下代码没有考虑所有其他所需的逻辑(签出、确保连接不能签出两次等)

    公共类连接HandlerPool{
    私有静态最终列表池=新ArrayList();
    //创建新线程时,它们将获得对所在池的引用
    私有void addConnection(){
    添加(新连接读取(池));
    }
    专用无效断开连接(连接读取ct){
    池。移除(ct);
    }
    }
    公共类ConnectionHandlerThread{
    专用最终连接HandlerPool池;
    公共ConnectionHandlerThread(ConnectionHandlerPool池){
    this.pool=pool;
    }
    私有空间销毁(){
    池。断开(此);
    }
    }
    
    请提供一个示例来说明您试图执行的操作。显示实际代码将帮助我们理解您试图用英语描述的内容。您编写了自己的连接池处理程序?连接处理程序不知道它们存储在列表中。要从列表中删除它们,它们必须调用处理程序上的方法为他们做这件事。@Code学徒我现在做得很好,这是一种过于复杂的方法。接口和侦听器功能是不必要的,因为如果连接引用了一个(单个)连接,您基本上可以做handlerPool.removeConnection(this)池。@kayman问题是java按值传递,因此我无法像转到
    runhandlerPool.removeConnection(此)时那样为它们提供对单个池的引用
    它将只编辑自身内部的版本,而不会编辑其他版本。否。Java通过值传递所有内容是的,包括引用。它将如我所述完美工作,但您需要阅读以下内容:
    public class ConnectionHandlerPool {
        private static final List<ConnectionThread> pool = new ArrayList<ConnectionThread>();
        // When new threads are created, they get a reference to the pool they're in
        private void addConnection() {
            pool.add(new ConnectionThread(pool));
        }
        private void disconnect(ConnectionThread ct) {
            pool.remove(ct);
        }
    }
    
    public class ConnectionHandlerThread {
        private final ConnectionHandlerPool pool;
        public ConnectionHandlerThread(ConnectionHandlerPool pool) {
            this.pool = pool;
        }
    
        private void destroy() {
            pool.disconnect(this);
        }
    }