【问题标题】:How to send a notification to the thread based on its name or id? Is it possible?如何根据线程的名称或 id 向线程发送通知?可能吗?
【发布时间】:2015-07-28 07:28:48
【问题描述】:

上下文:java 线程间通信

如何根据线程的名称或 id 向线程发送通知? 有可能吗?

我们无法在 Java 中与特定线程通信, 我们不知道调度程序何时将 CPU 分配给线程。 那么Thread类的public void setName(String name)public String getName()public int getId()方法的用途是什么。

这些方法仅有助于开发人员识别线程,还是我们可以将其用于线程间通信?

【问题讨论】:

  • “我们无法沟通特定的线程,这是正确的吗?”我不明白你在这里问什么。
  • @Stephen 我可以在 java 中与特定线程通信吗?
  • 仍然没有意义。 Java 不“通信”线程,在非技术意义上也没有意义。
  • 假设:10 个线程处于可运行状态我想通知“MyThread”。我可以吗?
  • 啊!所以你>>实际上

标签: java multithreading


【解决方案1】:

好吧,您可以通过编程方式find a thread by its name。有了Thread object,你就可以start()它,run()它,得到它的状态,它的堆栈跟踪,join()它,interrupt()and much more。这显然是线程间通信。所以是的,如果你知道它的名字,你就可以与给定的线程通信。

但我认为在典型情况下,通过名称查找线程没有多大意义。

【讨论】:

  • 同意,我只使用线程名来调试和检查日志。
  • 同意 Timo:我在日志中使用线程名称,以检查它是发生异常的调度程序,还是 HTTP 请求。
【解决方案2】:

上面的代码有效吗?

不,不是。 Thread 是一个类名,但 Thread.getName() 是一个实例方法。因此,该代码会给您一个编译错误。

但是,这将是有效的:

if (Thread.currentThread().getName().equals("MyThread1")){
     //MyThread1 specific code here
}

现在还不清楚这是否符合您的预期。它当然不会在任何意义上与线程通信。它只是说,“如果我在一个名为 "MyThread1" 的线程上运行,那么做某些事情”。


现在我们终于清楚地说明了你的问题......

如何根据线程名称或线程 ID 向线程发送通知?

假设您的意思是等待/通知样式通知,那么一般来说,您不能。

通过对某个对象进行Object.notify() 调用来发送通知,并由当前在同一对象上的Object.wait() 调用中阻塞的另一个线程接收。

  • 如果在没有线程等待的情况下发出通知调用,则它会丢失。
  • 如果对错误的对象进行了通知调用,则会丢失。

一般来说,任意线程不会以这种方式得到通知。它将做其他事情。可以根据线程的名称或 id 来识别线程这一事实实际上是无关紧要的。

你真正应该在这里做的是:

  1. 确定您需要的通知样式。同步与异步?是否保证交货?一对一还是一对多?是否传递了其他信息?
  2. 为“通知”选择最合适的原语。例如:
    • 等待/通知
    • 信号量
    • 屏障/闩锁
    • 队列/出队
    • 中断
    • 等等
  3. 设计您的应用程序,以便有一个 Map 或其他东西可以从线程名称映射到适当的“通知通道”对象以通知它。或者更好的是,不要。

【讨论】:

  • “MyThread1”为示例线程名,处于可运行状态的线程池
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多