Я выполняю параллельную серверную программу, и я ее тестирую. В тест 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)
я отправляю сообщение на сервер и жду, пока сервер не ответит.
Вы можете запустить поток из цикла 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
целое число, созданное для каждого цикла.
Вы можете определить свой собственный класс потоков, который принимает параметр 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);
}
}
вы можете сделать это:
for(int i = 0; i < clients.length; i++){
new Thread(()->{
clients[i].send(i+"");
}).start();
}
i
Integer, а неint
, есть ли причина?