如何在引用循环变量的匿名 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
整数。
我正在做一个并发服务器程序并且正在测试它。 在 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
整数。