我正在尝试通过多线程打印这些Log.w("aa",String.valueOf(x));
,Log.w("bb",String.valueOf(x));
,但应该一起使用,但不能。
Logcat结果
2019-08-30 11:28:28.885 4554-4554/com.test.app W/bb: 0
2019-08-30 11:28:28.885 4554-4554/com.test.app W/bb: 1
2019-08-30 11:28:28.885 4554-4554/com.test.app W/bb: 2
2019-08-30 11:28:28.885 4554-4554/com.test.app W/bb: etc... to 999
2019-08-30 11:28:28.909 4554-4554/com.test.app W/aa: 0
2019-08-30 11:28:28.909 4554-4554/com.test.app W/aa: 1
2019-08-30 11:28:28.909 4554-4554/com.test.app W/aa: 2
2019-08-30 11:28:28.909 4554-4554/com.test.app W/aa: etc... to 999
但是应该这样混合,不要在结束时不要等待第一个线程
2019-08-30 11:28:28.885 4554-4554/com.test.app W/aa: 0
2019-08-30 11:28:28.885 4554-4554/com.test.app W/bb: 0
2019-08-30 11:28:28.885 4554-4554/com.test.app W/aa: 1
2019-08-30 11:28:28.885 4554-4554/com.test.app W/bb: 1
2019-08-30 11:28:28.909 4554-4554/com.test.app W/aa: 2
2019-08-30 11:28:28.909 4554-4554/com.test.app W/bb: 2
2019-08-30 11:28:28.909 4554-4554/com.test.app W/aa: 3
2019-08-30 11:28:28.909 4554-4554/com.test.app W/bb: 3
etc...
代码
Thread a = new Thread() {
@Override
public void run() {
Log.i("Thread", "Running");
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
for(int x = 0 ; x < 1000 ; x++){
Log.w("aa",String.valueOf(x));
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
};
Thread b = new Thread() {
@Override
public void run() {
Log.i("Thread", "Running");
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
for(int x = 0 ; x < 1000 ; x++){
Log.w("bb",String.valueOf(x));
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
};
a.start();
b.start();
答案 0 :(得分:2)
由于runOnUiThread
,您的代码在MainThread中运行。
您需要删除runOnUiThread
:
new Thread(new Runnable() {
public void run() {
for(int x = 0 ; x < 3 ; x++){
Log.w("aa",String.valueOf(x));
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
public void run() {
for(int x = 0 ; x < 3 ; x++){
Log.w("bb",String.valueOf(x));
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
但是,如果要在Android中进行后台工作,则应使用AsyncTask或rxJava。
答案 1 :(得分:0)
为什么需要runOnUiThread。两者都在调用主线程。如果您不执行任何与UI更改相关的操作,则无需runOnUiThread即可执行此操作。没有runOnUiThread,两个线程可以同时工作。