我在android活动中定义了2个线程。两个线程都创建为可运行的实例。线程1是一个名为“timer1”的可运行对象(使用匿名内部类创建),线程2(分配给可运行对象“timer2”)使用线程2的处理程序(使用post()方法)从线程1调用。
线程2的处理程序称为“tempHandler”(它是一个实例变量),并在“MyRunnable”类的构造函数中初始化。
Thread1在for循环中对Thread2进行5次调用。预期的结果是Thread2应该在每次调用post()时运行。但它不会发生。相反,Thread1中的整个循环完成,然后才运行Thread2。为什么会这样?以及如何纠正它?
这是第一个主题:
timer1 = new Runnable() {
@Override
public void run() {
timer2 = new MyRunnable();
for(int i = 0; i < 5; i++){
tempHandler.post(timer2);
try{
Thread.sleep(1000);
} catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
};
这是第二个主题:
public class MyRunnable implements Runnable {
public MyRunnable() {
tempHandler = new Handler();
}
@Override
public void run() {
if(Looper.myLooper() == null) {
Looper.prepare();
}
long startTime = System.currentTimeMillis();
long stopTime = System.currentTimeMillis();
long elapsedTime = stopTime - startTime;
System.out.println("Array traversal time: " + String.valueOf(elapsedTime));
System.out.println("Exited thread 2");
Looper.loop();
}
}
答案 0 :(得分:0)
你没有显示启动线程的代码,但听起来好像你假设Runnable
是Thread
s。他们不是。
Runnable
就是这样:通过调用run()
方法可以运行的东西。但它运行在你调用它的同一个线程中。
一个例子,看看我在说什么:
public static void main(String[] args) {
final Thread mainThread = Thread.currentThread();
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println(mainThread);
System.out.println(Thread.currentThread());
System.out.println(mainThread == Thread.currentThread());
}
};
r.run();
}
输出类似于:
Thread[main,5,main]
Thread[main,5,main]
true
您创建了一个单独的线程,通过调用new Thread(r)
来运行Runnable
。用以下代码替换上例中的行r.run();
Thread newThread = new Thread(r);
newThread.start();
输出变为:
Thread[main,5,]
Thread[Thread-0,5,main]
false
成功 - 我们有两个不同的主题!
注意:确保您在Thread
个对象上拨打start()
,而不是run()
。这是您的代码无法正常工作的另一个可能原因。虽然Thread
对象具有公共run()
方法,但这是Java中的历史错误; you should never call it,因为它只是在当前线程上运行代码而不启动新代码。