【问题标题】:How to access a thread's object from another thread - Java如何从另一个线程访问线程的对象 - Java
【发布时间】:2014-04-25 08:10:25
【问题描述】:

我有一个扩展 Thread 的特定类。在我的主目录中,我创建了该类的许多线程。每个线程创建一个 Hero 类的对象(我创建的一个类)。

有没有一种方法可以让一个线程访问另一个线程的 Hero 类的对象? 我想有一种方法来比较两个不同线程的 Hero 类的两个对象,或者有一个方法可以将两个不同线程的两个对象作为参数,或者通过一种方法将一个线程的对象的值传递给另一个线程。

【问题讨论】:

  • 闻起来像 stackoverflow.com/questions/3605476/… 的复制品。今后,请在提问前使用搜索栏。当然,我们很乐意在这里回答上述主题未回答的任何问题。
  • 一个对象不属于线程。 Java 应用程序使用对象引用。只需将它们传递到需要它们并且可以访问的地方。

标签: java multithreading


【解决方案1】:

所以...正如其他人所说,您可以将所有 Hero 对象放在每个人都可以访问的静态列表、字典或其他结构中。

但在我看来,你实际上想要做的是创建活动对象http://en.wikipedia.org/wiki/Active_object

当您拥有活动对象时,每个活动对象都有自己的线程,该线程紧紧地缠绕在自己的处理循环中。该循环由来自其他对象的“消息”队列提供。

所以每个对象都存储一个对它想与之交谈的其他对象的引用,不是对线程的引用。线程隐藏在对象内部。每个对象只向其他对象公开一种方法——“QueueMessage”,它将消息放在该队列上进行处理。

该队列必须实现为线程安全的数据结构。在 Java 中最简单的方法是使用 ConcurrentLinkedQueue

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html

【讨论】:

    【解决方案2】:

    你可以做的是让扩展 Thread 的 Class 在其构造函数中接受 Class Hero 的对象,如下所示:

    public class YourClass extends Thread{
         private Hero hero;
    
         YourClass(Hero hero){
              this.hero= hero;           
             }
     } 
    

    这样您可以先创建对象并将其添加到 ArrayList,然后再将引用传递给新线程对象的构造函数:

    ArrayList heroes= new ArrayList<Hero>();//this should be declared at the class level
    Hero hero= new Hero();
    heroes.add(hero);
    YourClass thread= new YourClass(hero);
    

    英雄对象的 ArrayList 现在可用于所有线程,您可以编写一个方法来遍历它以找到您要查找的对象。你如何做到这一点很大程度上取决于你到底想要做什么。

    【讨论】:

    • 如果您没有正确处理同步,那么共享 ArrayList 可能会很危险。我会使用同步块或并发包中的内容来改写您的答案。
    猜你喜欢
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多