将参数传递给Java线程

将参数传递给Java线程,java,multithreading,runnable,Java,Multithreading,Runnable,我想用这种方式创建一个线程。如果可能,我如何将参数传递给run方法 < > > >编辑< /强>:为了使问题具体化,请考虑下面的代码段: Thread t = new Thread(new Runnable() { public void run() {} }); for(int i=0;i

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

< > > >编辑< /强>:为了使问题具体化,请考虑下面的代码段:

Thread t = new Thread(new Runnable() { public void run() {} });
for(int i=0;i

根据Jon的回答,这是行不通的,因为
i
没有声明为
final

否,
run
方法从来没有任何参数。您需要将初始状态设置为
Runnable
。如果使用的是匿名内部类,则可以通过最终的局部变量:

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?}});
}
如果要编写命名类,请向该类添加一个字段并将其填充到构造函数中

或者,您可以在
java.util.concurrent
中找到这些类,帮助您更多(
ExecutorService
等)-这取决于您尝试执行的操作

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

final int foo = 10; // Or whatever

Thread t = new Thread(new Runnable() {
    public void run() {
        System.out.println(foo); // Prints 10
    }
});
for(int i=0;i
您可以创建接受参数的自定义线程对象,例如:

for (int i=0; i< threads.length; i++) {
    final int foo = i;
    threads[i] = new Thread(new Runnable() {
         public void run() {
             // Use foo here
         }
    });
}
可以这样使用:

public class IndexedThread implements Runnable {
    private final int index;

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

    public void run() {
        // ...
    }
}
IndexedThread线程[]=新的IndexedThread[N];

对于(int i=0;ii如果您编写一个实现Runnable的新类并在构造函数中向其传递所需的所有参数可能会更容易。在IntelliJ中,它对此有一个自动更正。它为您将匿名类中使用的变量分配给最终变量。我建议您使用THRAEDLOCAL,这是一种更好的方法保留变量并将其传递给线程,尝试一下,结果可能会更好。Jon的答案很有效,您只需将i的值分配给循环中的最终局部变量。不过,我会支持使用ExecutorService的建议。我只是给出了一些关于我尝试执行的内容。@Terryl:请参阅我的编辑以了解如何执行在循环中使用我的第一种方法。或者只使用命名类。。。
IndexedThread threads[] = new IndexedThread[N];

for (int i=0; i<threads.length; i++) {
    threads[i] = new IndexedThread(i);
}