当前位置: 代码迷 >> java >> 如何根据名称或ID向线程发送通知? 可能吗?
  详细解决方案

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

热度:84   发布时间:2023-08-04 09:15:09.0

上下文:java线程间通信

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

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

这些方法只有开发人员才能识别线程,或者我们可以将它用于线程间通信吗?

好吧,您可以编程方式 。 有了 ,你可以start()它, run()它,获取它的状态,它的堆栈跟踪, join()它, interrupt() 这显然是线程间的沟通。 所以是的,如果你知道它的名字,你可以与给定的线程进行通信。

但是我不认为在典型的情况下找到一个名字的线程很有意义。

以上代码是否有效?

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

但是,这是有效的:

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

现在还不清楚这是否符合您的期望。 它无论如何都无法与线程通信。 它简单地说,“如果我在一个名为"MyThread1"的线程上运行,那么就做某些事情”。


现在终于我们对你的问题有了明确的陈述....

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

假设您的意思是等待/通知样式通知,那么通常情况下,您不能。

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

  • 如果在没有线程等待时进行通知调用,则它将丢失。
  • 如果对错误的对象进行通知调用,则它将丢失。

通常,任意线程都不会以这种方式通知。 它将做其他事情。 可以基于其名称或ID识别线程这一事实实际上是不重要的。

你应该在这里做的是:

  1. 确定所需的通知方式。 同步与异步? 保证交货与否? 1对1还是1对多? 是否通过了其他信息?
  2. 为“通知”选择最合适的原语。 例如:
    • 等待/通知
    • 信号灯
    • 障碍/闩锁
    • 队列/队列
    • interupts
    • 诸如此类
  3. 设计您的应用程序,以便有一个Map或某些东西,它将从一个线程的名称映射到相应的“通知通道”对象以通知它。 或者更好的是,不要。
  相关解决方案