【问题标题】:Basic Java Multi-Threading Question基本 Java 多线程问题
【发布时间】:2011-01-27 13:25:19
【问题描述】:

当一个对象在Java中实例化时,它是否绑定到实例化的线程上?因为当我在一个线程中匿名实现一个接口,并将它传递给另一个线程运行时,它的所有方法都在原来的线程中运行。如果它们被绑定到它们的创建线程,是否有办法创建一个在调用它的线程中运行的对象?

【问题讨论】:

  • 你怎么知道它们是“在原始线程中运行的”?
  • 所以你创建了一个匿名类来实现一些接口。您如何“将其传递给另一个线程”?管道?溪流?作为增强传递给线程的类构造函数?
  • 好吧,我通过消息传递它。当另一个线程收到消息并尝试运行代码(即绘图代码)时,它声称我正在从原始线程进行绘图,这是被禁止的。
  • 您需要提供更多信息。首先,您不使用 java VM,而是使用 androids Dalvik VM。其次,您使用 android 绘图 API,哪些以及如何使用?在单独的线程中在 Android 上进行绘图有一些要求,因为多个调用实际上并不绘制任何东西,而是添加绘图指令,这些指令在可能发生在不同线程中的无效之前不会执行。所以需要更多信息和代码。

标签: java multithreading heap-memory stack-memory anonymous-class


【解决方案1】:

如果线程A创建了一个对象:

MyClass.staticMember = new Runnable() {...};

并且线程 B 调用该对象的方法:

MyClass.staticMember.run();

那么run()方法将在线程B中执行。

线程 A 只会继续运行它当时正在运行的任何代码。

【讨论】:

  • 嗯,它肯定是在原始线程中运行对象的方法。它给我的错误非常具体。如果有任何帮助,这一切都在 Android 上,而不是标准的 Java VM。
  • 在我上面发布的情况下,run() 将始终无一例外地在线程 B 中执行。发布更多代码,我们可能会提供帮助。 Mark 对绘图 API 的解释听起来很到位。
【解决方案2】:

对象未绑定到创建它的线程...在主线程上执行方法的唯一方法是在主线程上调用它们。

查看哪个线程调用该方法相对容易......只需制作一个虚拟函数:

public threadDetect(string which)
{
    System.out.println("Executed from " + which + " thread.");
}

在你调用的主线程中:

threadDetect("main");

从你调用的子线程:

threadDetect("child");

我不确定 OP 是否使用类似的方式来检测哪个线程正在执行该方法,但这是一种方法。

【讨论】:

    猜你喜欢
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多