我想为每个创建的矩形创建一个单独的线程。我需要传递参数来运行线程,而且不允许这样做。我无法弄清楚如何做到这一点。这就是我已经写过的:
int number_of_cubes = 10;
Rect[] r1 = new Rect[number_of_cubes];
for(int i=0; i <number_of_cubes;i++){
Thread myThread = new Thread(new Runnable()
{
public void run(Rect[] r1,int i){
Random rn = new Random();
Random rand = new Random();
float r = rand.nextFloat();
float g = rand.nextFloat();
float b = rand.nextFloat();
Color randomColor = new Color(r, g, b);
r1[i] = new Rect(rn.nextInt(600), rn.nextInt(400), 15, 15, randomColor);
}
});
}
答案 0 :(得分:1)
至于您的直接问题,请使用
final Rect[] r1 = new Rect[number_of_cubes];
for (int i = 0; i < number_of_cubes; i++) {
final int targetIndex = i;
new Thread(new Runnable() { public void run() {
...
r1[targetIndex] = ...
}}).start();
还有几点说明:
线程创建的开销足够大,只有当你有实质的工作量时,这个成语才能开始有意义。比方说,至少有10,000个矩形;
您正在冗余地创建两个Random
个实例。每个线程只使用一个;
注意可见性问题:只有在所有线程完成后才能使用矩形数组(join
方法在每个线程上main
);
只有中等数量的线程才能获得性能提升,通常等于可用CPU核心数量;
更好的方法是使用Executor服务。
答案 1 :(得分:0)
执行此操作,它将创建一个使用参数运行所需线程的函数。然后,在for循环中,您可以调用它,但是您希望:
nt number_of_cubes = 10;
Rect[] r1 = new Rect[number_of_cubes];
for(int i=0; i <number_of_cubes;i++){
//call the function here if you want
}
public void runThread(final Rect[] r1,final int i){
new Thread(new Runnable(){
@Override
public void run(){
Random rn = new Random();
Random rand = new Random();
float r = rand.nextFloat();
float g = rand.nextFloat();
float b = rand.nextFloat();
Color randomColor = new Color(r, g, b);
r1[i] = new Rect(rn.nextInt(600), rn.nextInt(400), 15, 15, randomColor);
}
}).start();
}