Android线程在for循环中

Android线程在for循环中,android,multithreading,for-loop,Android,Multithreading,For Loop,我有一个for循环,其中包含一个线程。代码可以工作,但参数没有正确地传递给函数。你能帮我吗 for(i= 1 ;i < 30; i++) { Thread thread = new Thread() { @Override public void run() { example_function(i); } }; thread.start(); } (i=1;i

我有一个for循环,其中包含一个线程。代码可以工作,但参数没有正确地传递给函数。你能帮我吗

for(i= 1 ;i < 30; i++) {
    Thread thread = new Thread() {
        @Override
        public void run() {
            example_function(i);
        }
    };

    thread.start();
}
(i=1;i<30;i++)的
{
线程线程=新线程(){
@凌驾
公开募捐{
示例_函数(i);
}
};
thread.start();
}

您应该在线程中添加一个int j字段,并在运行线程之前用thread.j=i对其进行初始化

for(i= 1 ;i < 30; i++) {
Thread thread = new Thread() {
    final int j;
    @Override
    public void run() {
        example_function(j);
    }
 };
thread.j = i;
thread.start();
}
(i=1;i<30;i++)的
{
线程线程=新线程(){
最终int j;
@凌驾
公开募捐{
示例_函数(j);
}
};
螺纹j=i;
thread.start();
}

您应该在线程中添加一个int j字段,并在运行线程之前用thread.j=i对其进行初始化

for(i= 1 ;i < 30; i++) {
Thread thread = new Thread() {
    final int j;
    @Override
    public void run() {
        example_function(j);
    }
 };
thread.j = i;
thread.start();
}
(i=1;i<30;i++)的
{
线程线程=新线程(){
最终int j;
@凌驾
公开募捐{
示例_函数(j);
}
};
螺纹j=i;
thread.start();
}

使用参数扩展
线程

class IntThread extends Thread {

    private int i;

    public IntThread( int i ) {
       this.i = i;
    }

    @Override
    public void run() {
        example_function( this.i );
    }
}
然后按如下方式执行:

    for(int i= 1 ;i < 30; i++) {
        new IntThread( i ).start();
    }
for(int i=1;i<30;i++){
新的IntThread(i).start();
}

使用参数扩展
线程

class IntThread extends Thread {

    private int i;

    public IntThread( int i ) {
       this.i = i;
    }

    @Override
    public void run() {
        example_function( this.i );
    }
}
然后按如下方式执行:

    for(int i= 1 ;i < 30; i++) {
        new IntThread( i ).start();
    }
for(int i=1;i<30;i++){
新的IntThread(i).start();
}

这段代码一开始看起来很可疑,但您确实应该在线程中使用
Runnable
s

如果您添加如下
MyRunnable
类,这样的内容将打印您想要的内容:

private class MyRunnable implements Runnable {
    private int i;
    public MyRunnable(int i) {
        this.i = i;
    }

    @Override
    public void run() {
        example_function(i);
    }
}
然后,for循环变成:

for(i= 1 ;i < 30; i++) {
    new Thread(new MyRunnable(i)).start();
}
(i=1;i<30;i++)的
{
新线程(new MyRunnable(i)).start();
}

数字仍然可以按顺序打印,但每个数字只打印一次。

此代码一开始看起来可疑,但您确实应该在线程中使用
Runnable
s

如果您添加如下
MyRunnable
类,这样的内容将打印您想要的内容:

private class MyRunnable implements Runnable {
    private int i;
    public MyRunnable(int i) {
        this.i = i;
    }

    @Override
    public void run() {
        example_function(i);
    }
}
然后,for循环变成:

for(i= 1 ;i < 30; i++) {
    new Thread(new MyRunnable(i)).start();
}
(i=1;i<30;i++)的
{
新线程(new MyRunnable(i)).start();
}

数字仍然可以按顺序打印,但每个数字只打印一次。

i
需要是
final
才能在匿名
线程
内部类:)除此之外,还有什么不对的?预期结果是什么?实际结果/输出是什么?在函数i中打印i值,它们不是1到30。有些值会出现2到3次,我猜
i
是一个类字段,这就是为什么它运行时不是最终值。当你运行你的线程并打印时,
i
可能已经增加了很多倍,这就是你得到重复的原因。确保
i
synchronized
volatile
然后。。。看看这能不能改善它?好的捕捉@ GeGoMigLIGN我没有考虑到公然的比赛条件。Shockelduck请附加您的输出,以便我们更好地查看问题。这也不行,因为所有正在运行的线程仍然看到相同的
i
。OP可以在
线程
上有一个int字段,并将
i
传递给线程的构造函数。
i
需要是
final
才能在匿名
线程
内部类:)除此之外,还有什么传递不正确?预期结果是什么?实际结果/输出是什么?在函数i中打印i值,它们不是1到30。有些值会出现2到3次,我猜
i
是一个类字段,这就是为什么它运行时不是最终值。当你运行你的线程并打印时,
i
可能已经增加了很多倍,这就是你得到重复的原因。确保
i
synchronized
volatile
然后。。。看看这能不能改善它?好的捕捉@ GeGoMigLIGN我没有考虑到公然的比赛条件。Shockelduck请附加您的输出,以便我们更好地查看问题。这也不行,因为所有正在运行的线程仍然看到相同的
i
。OP可以在
线程
上有一个int字段,并将
i
传递到线程的构造函数中。您的方法是正确的,但此代码不会编译--
线程
没有名为
j
的成员,
最终
成员无论如何都不能更改。您的方法是正确的,但是此代码不会编译--
线程
没有名为
j
的成员,
最终
成员无论如何都不能更改。