用Java进行线程化。在新线程中创建每个图形,循环不起作用

时间:2013-11-24 12:32:29

标签: java multithreading

我想为每个创建的矩形创建一个单独的线程。我需要传递参数来运行线程,而且不允许这样做。我无法弄清楚如何做到这一点。这就是我已经写过的:

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

        });
    }

2 个答案:

答案 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();
}