0

是否可以将 i 的值传递给新的线程对象?

当前代码:

int cores = 4;
final int n = 10000;
static double sum = 0.0;

Thread[] threads = new Thread[cores];

for (int i = 0; i < cores; i++)
{
    threads[i] = new Thread(new Runnable() {
        public void run() {
            for (int j = i * (n / cores); j < (i + 1) * N / P; j++) {
                double x = (j + 0.5) * step;
                sum += 4.0 / (1.0 + x * x);
            }
        }
    });
}

问候

4

2 回答 2

1

创建您自己的扩展内部类Thread,然后将您的值传递给该类的实例,无论您想要什么 - 构造函数、setter 方法等。

这是使用构造函数的起始代码。

public class MyThread extends Thread
{
   private int myI;

   public MyThread(int i) { myI = i; }

   @Override
   public void run()
   {
      // Your code goes here, referencing the "myI" variable.
   }
}
于 2013-02-05T17:55:54.917 回答
0

可以解决您的问题的代码的最小更改是添加一个如下index所示的变量,带有final修饰符:

for (int i = 0; i < cores; i++)
{
    final int index = i; // put value of "i" into a final variable
    threads[i] = new Thread(new Runnable() {
        public void run() {
            // use "index" instead of "i"
            for (int j = index * (n / cores); j < (index + 1) * N / P; j++) {
                double x = (j + 0.5) * step;
                sum += 4.0 / (1.0 + x * x);
            }
        }
    });
}

带有修饰符的变量final保证不会改变,因此可以在匿名类的实例中使用。

于 2013-02-05T17:59:40.850 回答