Java 线程列表和访问另一个列表

Java 线程列表和访问另一个列表,java,arrays,multithreading,list,Java,Arrays,Multithreading,List,几分钟前,我已经提出了另一个接近这个问题的问题,有很好的答案,但这不是我想要的,所以我试着说得更清楚一点 假设我有一个类中的线程列表: class Network { private List<Thread> tArray = new ArrayList<Thread>(); private List<ObjectInputStream> input = new ArrayList<ObjectInputStream>();

几分钟前,我已经提出了另一个接近这个问题的问题,有很好的答案,但这不是我想要的,所以我试着说得更清楚一点

假设我有一个类中的线程列表:

class Network {

    private List<Thread> tArray = new ArrayList<Thread>();
    private List<ObjectInputStream> input = new ArrayList<ObjectInputStream>();

    private void aMethod() {
        for(int i = 0; i < 10; i++) {
            Runnable r = new Runnable() {
                public void run() {
                    try {
                        String received = (String) input.get(****).readObject(); // I don't know what to put here instead of the ****
                        showReceived(received); // random method in Network class
                    } catch (IOException ioException) {
                        ioException.printStackTrace();
                    }
                }
            }
            tArray.add(new Thread(r));
            tArray.get(i).start();
        }
    }
}
类网络{
私有列表tArray=newarraylist();
私有列表输入=新的ArrayList();
私人空间法(){
对于(int i=0;i<10;i++){
Runnable r=新的Runnable(){
公开募捐{
试一试{
接收的字符串=(字符串)输入。get(****)。readObject();//我不知道在这里放什么,而不是****
showReceived(received);//网络类中的随机方法
}捕获(IOException IOException){
ioException.printStackTrace();
}
}
}
tArray.add(新线程(r));
tArray.get(i.start();
}
}
}
我应该用什么来代替**? 例如,tArray列表的第一个线程只能访问输入列表的第一个输入


编辑:假设我的输入列表已经有10个元素

如果你把
i
放进去,它就可以工作了。您还需要为每个线程向列表中添加一个
ObjectInputStream
。我建议您使用
输入。为此,请添加
。您还需要用一些线程填充
tArray
列表,再次在那里使用add。

以下是解决方案:

private void aMethod() {
    for(int i = 0; i < 10; i++) {
        final int index = i;  // Captures the value of i in a final varialbe.
        Runnable r = new Runnable() {
            public void run() {
                try {
                    String received = input.get(index).readObject().toString(); // Use te final variable to access the list.
                    showReceived(received); // random method in Network class
                } catch (Exception exception) {
                    exception.printStackTrace();
                }
            }
        };
        tArray.add(new Thread(r));
        tArray.get(i).start();
    }
}
private void-aMethod(){
对于(int i=0;i<10;i++){
final int index=i;//捕获最终变量be中i的值。
Runnable r=新的Runnable(){
公开募捐{
试一试{
String received=input.get(index.readObject().toString();//使用te final变量访问列表。
showReceived(received);//网络类中的随机方法
}捕获(异常){
异常。printStackTrace();
}
}
};
tArray.add(新线程(r));
tArray.get(i.start();
}
}
由于希望每个线程从输入数组访问一个元素,因此可以使用
i
变量的值作为列表的索引。直接使用
i
的问题是内部类无法从封闭范围访问非最终变量。为了克服这个问题,我们将
i
分配给最后一个变量
index
。作为最终的
索引
可以通过
Runnable
的代码访问

其他修复程序:

  • readObject().toString()
  • catch(异常)
  • tArray.add(新线程(r))

是的,对不起,我想假设输入列表已经归档。但如果我用I代替****,它就不会编译,因为当它退出循环时,我就不存在了,这与您所说的线程不存在相反<代码>i
被传递给编译器生成的构造函数,它应该留在内部类中。错误消息到底是什么?将
i
复制到循环中的
final
变量中,并使用该变量:
final int i2=i不能引用在不同类型中定义的内部类中的非最终变量imethod@damo这可能是个好主意,但假设我出于某种原因必须删除一个线程(假设一个客户端断开连接,我执行tArray.remove(3),input.remove(3)),问题是对于第十个客户端,i2仍然具有相同的值,事实上,它必须递减到9,因为第10个客户机现在在listWoops中处于第9位,很抱歉出现了错误。不幸的是,正如我告诉damo的那样,我不能做这样的事情,因为如果出于某种原因我必须删除一个线程(比如说一个客户端断开连接,我做了tArray.remove(3),input.remove(3)),问题是对于第十个客户端,索引仍然具有相同的值,而实际上,它必须递减到9,因为第十位客户现在在排行榜上排名第九,也许会对你有所帮助