当-A活动方法从Runnable B调用时会发生什么。多个线程同时调用Activity方法

时间:2015-04-15 16:31:20

标签: java android multithreading

对于问题的第一部分,请考虑以下伪代码。

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上使用。如果不是,我会立即将其删除。谢谢你的帮助。我真的很感激。

1 个答案:

答案 0 :(得分:4)

1)它将在一个单独的线程(不是UI线程)中运行;

2)会有竞争条件。两个线程将同时调用myMethod()。为防止出现可能的错误,您必须在某些对象的方法中添加myMethod() synchronized或添加synchronized块。

如果你正确地开始新线程,所有这些都会发生或当然:)现在你在run()上拨打Runnable这不是正确的方法。您应该使用(new Thread(new TaskOne())).start();