我有一个扩展Thread的特定类。在我的主要我创建该类的一些线程。每个线程都创建一个Hero类的对象(由我创建的类)。
有没有办法让一个线程可以访问另一个线程的Hero类的对象? 我想有办法比较两个不同线程的Hero类的两个对象,要么有一个方法可以作为参数两个不同线程的两个对象,或者通过一种方法将一个线程的对象的值传递给另一个线程。
答案 0 :(得分:0)
你可以做的是让扩展线程的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);
Hero对象的ArrayList现在可用于所有线程,您可以编写一个迭代它的方法来查找您要查找的对象。你如何做到这一点很大程度上取决于你想要做什么。
答案 1 :(得分:0)
所以...正如其他人所说,你可以将所有Hero对象放在静态列表,字典或其他每个人都可以访问的结构中。
但它的声音对我来说就像你想要做的那样是创建活动对象http://en.wikipedia.org/wiki/Active_object
当你有Active对象时,每个Active Object都有自己的线程,它紧紧地缠绕在自己的处理循环上。该循环由来自其他对象的“消息”队列提供。
所以每个对象都存储对它想要与之交谈的其他对象的引用,不对线程的引用。线程隐藏在对象内部。每个对象只向一个方法公开一个方法 - “QueueMessage”,它将消息放在该队列上进行处理。
该队列必须实现为线程安全的数据结构。在Java中最简单的方法是使用ConcurrentLinkedQueue
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html