7
Thread t = new Thread(new Runnable() { public void run() {} });

我想以这种方式创建一个线程。如果可能的话,如何将参数传递给run方法?

编辑:要具体说明我的问题,请考虑以下代码段:

for (int i=0; i< threads.length; i++) {
    threads[i] = new Thread(new Runnable() {public void run() {//Can I use the value of i in the method?}});
}

根据乔恩的回答,它不会起作用,因为i它没有被声明为final.

4

2 回答 2

10

不,该run方法从来没有任何参数。您需要将初始状态放入Runnable. 如果您使用的是匿名内部类,则可以通过 final 局部变量来实现:

final int foo = 10; // Or whatever

Thread t = new Thread(new Runnable() {
    public void run() {
        System.out.println(foo); // Prints 10
    }
});

如果您正在编写命名类,请向该类添加一个字段并将其填充到构造函数中。

或者,您可能会发现这些课程对java.util.concurrent您有更多帮助(ExecutorService等) - 这取决于您要做什么。

编辑:要将上述内容放入您的上下文中,您只需要循环中的最终变量:

for (int i=0; i< threads.length; i++) {
    final int foo = i;
    threads[i] = new Thread(new Runnable() {
         public void run() {
             // Use foo here
         }
    });
}
于 2012-12-17T08:19:25.300 回答
4

您可以创建一个接受您的参数的自定义线程对象,例如:

public class IndexedThread implements Runnable {
    private final int index;

    public IndexedThread(int index) {
        this.index = index;
    }

    public void run() {
        // ...
    }
}

可以这样使用:

IndexedThread threads[] = new IndexedThread[N];

for (int i=0; i<threads.length; i++) {
    threads[i] = new IndexedThread(i);
}
于 2012-12-17T08:36:26.870 回答