对于问题的第一部分,请考虑以下伪代码。
public class Main extends Activity {
.
.
// all necessary overridden methods
.
.
Button.onClick() {
(new Task()).run();
}
public void myMethod() {
// do something here
}
public class Task extends Runnable {
@Override
public void run() {
myMethod();
}
}
}
我不是Java或任何其他编程语言的专家,因此我无法理解在单击myMethod()
时如何执行方法Button
。将myMethod()
作为单独的"实例"在Thread
的单独Runnable
内执行方法?或者它会在UI Thread
内执行,因为它是我Activity
类的一部分。
现在问题的第二部分,请考虑以下伪代码。
public class Main extends Activity {
.
.
// all necessary overridden methods
.
.
Button.onClick() {
(new TaskOne()).run();
(new TaskTwo()).run();
}
public void myMethod() {
// do something here
}
public class TaskOne extends Runnable {
@Override
public void run() {
for(int i=0; i<20; i++) {
myMethod();
Thread.sleep(2000);
}
}
}
public class TaskTwo extends Runnable {
@Override
public void run() {
for(int i=0; i<20; i++) {
myMethod();
Thread.sleep(2000);
}
}
}
}
如果myMethod()
在UI线程中运行,因为它是Activity
的一部分,那么当两个Runnable
实例同时调用该方法时会发生什么?我很困惑。每个Runnable
实例是否会执行单独的&#34;实例&#34;该方法,如果没有,会发生什么?每个线程是否会等待myMethod()
的执行?
我的困惑来自于尝试实施LoaderManager.LoaderCallbacks
。如果由于连续的数据库更新而onLoadFinished()
已经在运行时调用onLoadFinished()
会怎样?
我希望这篇文章适合在StackOverflow上使用。如果不是,我会立即将其删除。谢谢你的帮助。我真的很感激。
答案 0 :(得分:4)
1)它将在一个单独的线程(不是UI线程)中运行;
2)会有竞争条件。两个线程将同时调用myMethod()
。为防止出现可能的错误,您必须在某些对象的方法中添加myMethod()
synchronized
或添加synchronized
块。
如果你正确地开始新线程,所有这些都会发生或当然:)现在你在run()
上拨打Runnable
这不是正确的方法。您应该使用(new Thread(new TaskOne())).start();
。