在自定义线程中创建的对象在主线程上运行

时间:2014-07-30 21:15:38

标签: java android multithreading

在Android上,我有一个扩展Thread的MyThread类。在MyThread中,我声明了一些对象并在run()方法中初始化它们。对象是具有自己的构造函数的自定义类的实例。其中一些触发另一个后台线程并接受也在MyThread的run()方法内初始化的侦听器对象。我的问题是,这些侦听器是在主线程而不是MyThread上执行的。

所以我的问题是:在自定义Thread上实例化的自定义对象的方法是什么?

3 个答案:

答案 0 :(得分:3)

创建哪些线程对象并不重要,重要的是从哪个线程调用对象上的方法。

例如:

class MyThread extends Thread {

    public MyObject myObject;

    @Override
    public void run() {
        myObject = new MyObject();

        /* Do stuff */
    }

}

使用此课程:

MyThread myThread = new MyThread();
myThread.start();
myThread.myObject.someMethod();

此处,someMethod调用已在主线程上完成

答案 1 :(得分:1)

对于他们实例化的线程并不重要,可以从任何引用它们的线程中访问对象(以及您的侦听器)(无论它是否为安全这样做是另一个问题。)

对象不存在于任何线程上 - 当您从线程A调用对象上的方法时,该方法中的代码将在线程A上运行,而不管创建对象的线程如何。 / p>

答案 2 :(得分:0)

当一个节目开始时,它在聚会前是一个空房间。然后爱丽丝带着她的手提袋进来,开始清理东西。过了一段时间,爱丽丝打电话给鲍勃,后来鲍勃来到厨房帮助爱丽丝。爱丽丝和鲍勃准备了一些糖果,过了一会儿,史蒂夫和莎拉用啤酒和薯条敲门。

爱丽丝,鲍勃,史蒂夫和莎拉都是线程。爱丽丝是主线,因为她组织了派对。糖果,啤酒和薯条是对象。请注意,史蒂夫带来了芯片,但爱丽丝也可以吃掉它们!莎拉负责啤酒,但其他人肯定会喝酒。谁(哪个线程)将什么(创建的对象)带到聚会上并不重要:内存在thred之间共享。

现在,让我们来看看你的爱丽丝是如何工作的。 Android应用程序的主要线程是一个事件循环,可以看作:

while (running) {
  if (input != null) dispatch(input);
  sleepForSomeTime();
}

dispatch()的调用最终会触及您的侦听器代码,以便在处理触摸事件的同一线程上执行 。创建对象,注册听众的人等等并不重要。

我认为您的应用程序并非如此,但实际上可能需要在后台线程池中处理事件。这是通过为线程提供要完成的任务队列,以及让事件驱动的代码更新该队列(或者您可以在java.util.concurrent中使用执行程序框架)

来实现的。

作为注释,您不应该在构造函数中启动线程,因为

  1. 在完全构建之前可能会看到一些对象(如果使用内部类或匿名对象)
  2. 构造函数的目的是初始化字段。后台线程的创建应该由新构造的对象的用户处理