繁体   English   中英

当以下情况发生时-A.从可运行的B中调用Activity方法。多个线程同时调用Activity方法

[英]What happens when- A. Activity method is called from Runnable B. Multiple threads call Activity method simultaneously

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

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或任何其他编程语言的专家,所以我无法理解单击Button时如何执行myMethod()方法。 myMethod()是否将在Runnable的单独Thread中作为方法的单独“实例”执行? 否则它将在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()由于它是Activity的一部分而在UI线程中运行,那么当两个Runnable实例同时调用该方法时会发生什么? 我很混乱。 每个Runnable实例都将执行该方法的单独“实例”,否则,将发生什么? 每个线程都会等待对方对myMethod()的执行吗?

我的困惑来自尝试实现LoaderManager.LoaderCallbacks 如果什么onLoadFinished()被调用,而onLoadFinished()已经由于连续的数据库更新运行?

我希望这篇文章适合在StackOverflow上发表。 如果不是,我会立即将其删除。 谢谢你的帮助。 我真的很感激。

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

2)会有比赛情况。 两个线程将同时调用myMethod() 为防止可能的错误,您将必须使myMethod() synchronized或在某些对象的方法内部添加synchronized块。

如果正确启动新线程,所有这些都会发生或发生:)现在您在Runnable上调用run() ,这不是正确的方法。 您应该使用(new Thread(new TaskOne())).start();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM