【问题标题】:How to observe multiple observable threads如何观察多个可观察线程
【发布时间】:2012-11-04 12:56:26
【问题描述】:

我正在尝试在 java 中创建一个程序,其中线程是可观察对象,窗口是观察者。我不明白的是如何在更新方法上区分几个线程,它们都做同样的事情,以便我可以单独更新它们在窗口上的位置。

【问题讨论】:

  • 您可以为每个线程关联一个名称,而不是使它们都相同。

标签: java multithreading observer-pattern observable


【解决方案1】:

正如@PeterLawrey 在评论中所述,您可以使用Thread 对象中的名称参数来设置一个唯一名称,然后查询您的线程并找出哪个线程在做什么。构造函数如下:

public Thread(String name)
    Allocates a new Thread object. This constructor has the same effect as Thread (null, null, name).
Parameters:
    name - the name of the new thread

但是,为了在线程执行后更轻松地访问线程并进行跟踪,我建议使用ThreadGroup 对象。来自 api 文档:

一个线程组代表一组线程。此外,一个线程组还可以包括其他线程组。线程组形成一棵树,其中除了初始线程组之外的每个线程组都有一个父级。

因此,可以使用public int enumerate(Thread[] list, boolean recurse)的方法

哪个

将此线程组中的每个活动线程复制到指定的数组中。如果 recurse 为真,则此方法递归枚举此线程组的所有子组,并且还包括对这些子组中每个活动线程的引用。如果数组太短而无法容纳所有线程,多余的线程将被忽略。

和getName() 组中的所有线程。我希望它有所帮助。干杯

【讨论】:

  • +1 我建议你使用 Runnable 并给它一个名称字段。
  • @PeterLawrey:ThreadGroups 不是已经过时了一段时间吗?
  • @Cratylus AFAIk 线程组仅对应用程序服务器有用。我不使用它们。
  • 我明白了。但是稍后在更新(Observable arg0,Object arg1)中,我如何识别正在更新的线程?使用 getName()?
  • 正如我在回答中所说:A thread group represents a set of threads。因此,您可以使用此对象来跟踪您的线程。还有其他方法可以跟踪(并操纵它们),例如使用@PeterLawrey 所述的ExecutorService,甚至简单地创建ArrayList<Thread>(顺便说一句,这不是一个好主意)。之后,您可以遍历您的 Thread 对象并“询问”它们的名称和/或 Thread.State
【解决方案2】:

如果名称不够,您可以考虑使用ThreadStatic 来存储有关每个线程的其他信息:

class ThreadPosition {
   [ThreadStatic]
   private static int x;

   /**
   * Only call from thread.
   **/
   public static int getX()
   {
     return x;
   }
}

【讨论】:

    猜你喜欢
    • 2011-06-17
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 2020-04-02
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多