Android线程在for循环中
我有一个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(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
的成员,最终
成员无论如何都不能更改。