如何在引用循环变量的匿名 class 循环中创建线程?

How to create threads in a loop, in an anonymous class referring to the loop variable?

我正在做一个并发服务器程序并且正在测试它。 在 JUnit 测试中,我输入以下内容:

[...]

Client[] clients = new Client[30];
for ( int i = 0; i<30 ; i++){
    clients[i] = new Client("localhost", SERVPORT);
}

for ( Integer i = 0; i<30 ; i++){
    new Thread(){
        public void run(){
            clients[i].send(i.toString()); <--
        }
    }.start();
}
[...]

问题是 Java 没有编译,因为我不能引用在不同方法定义的内部 class 中的非最终变量 i ,所以我必须修改和编写我是最终的(但我不应该)。我明白了,但是...如何同时从所有客户端发送消息?

附加信息: 在方法send(String)中,我向服务器发送消息,等待服务器响应。

你可以这样做:

for(int i = 0; i < clients.length; i++){
  new Thread(()->{
     clients[i].send(i+"");
  }).start();
}

您可以定义自己的线程class,在构造函数中接受客户端参数。

class MyThread extends Thread
{
    private Client client;
    private String message;
    MyThread(Client client, String message)
    {
        this->client = client;
        this->message = message;
    }
    public void run()
    {
        client.send(message);
    }
}

您可以 运行 原始 for 循环中的线程,通过引用局部变量来跳过索引变量 i 的使用:

final Client[] clients = new Client[30];
for (int i = 0; i < 30; i++) {
    final Integer integer = new Integer(i);
    final Client client = new Client("localhost", SERVPORT);
    clients[i] = client;
    new Thread(){
        public void run(){
            client.send(integer.toString());
        }
    }.start();
}

注意为每个循环创建的 final 整数。