Как создать потоки в цикле, в анонимном классе, ссылаясь на переменную цикла?

1

Я выполняю параллельную серверную программу, и я ее тестирую. В тест 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 не компилируется, потому что я не могу ссылаться на не конечную переменную я внутри внутреннего класса, определенного в другом методе, поэтому мне нужно изменить и написать я как final (но я не должен). Я понимаю это, но... Как я могу отправлять сообщения от всех клиентов одновременно?

Дополнительная информация: В методе send(String) я отправляю сообщение на сервер и жду, пока сервер не ответит.

  • 0
    Почему i Integer, а не int , есть ли причина?
  • 0
    Потому что я хочу отправить на сервер i.toString () и для этого метода мне нужен объект, который является Integer, а не int
Показать ещё 2 комментария
Теги:
multithreading
loops
server

3 ответа

2
Лучший ответ

Вы можете запустить поток из цикла origin 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 целое число, созданное для каждого цикла.

0

Вы можете определить свой собственный класс потоков, который принимает параметр Client в конструкторе.

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);
    }
}
0

вы можете сделать это:

for(int i = 0; i < clients.length; i++){
  new Thread(()->{
     clients[i].send(i+"");
  }).start();
}
  • 0
    Этот ответ появился в очереди проверки низкого качества, вероятно, потому что вы не объяснили код. Если вы объясните это (в своем ответе), у вас будет гораздо больше шансов получить больше голосов, а спрашивающий с большей вероятностью что-нибудь узнает!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню