问题描述
上下文:java线程间通信
如何根据名称或ID向线程发送通知? 可能吗?
我们无法在Java中传递特定线程,我们不知道调度程序何时将CPU分配给线程。
那么Thread
类的方法public void setName(String name)
, public String getName()
和public int getId()
方法的目的是什么?
这些方法只有开发人员才能识别线程,或者我们可以将它用于线程间通信吗?
1楼
好吧,您可以编程方式 。
有了 ,你可以start()
它, run()
它,获取它的状态,它的堆栈跟踪, join()
它, interrupt()
。
这显然是线程间的沟通。
所以是的,如果你知道它的名字,你可以与给定的线程进行通信。
但是我不认为在典型的情况下找到一个名字的线程很有意义。
2楼
以上代码是否有效?
不,不是。
Thread
是一个类名,但Thread.getName()
是一个实例方法。
因此,该代码将给您一个编译错误。
但是,这是有效的:
if (Thread.currentThread().getName().equals("MyThread1")){
//MyThread1 specific code here
}
现在还不清楚这是否符合您的期望。
它无论如何都无法与线程通信。
它简单地说,“如果我在一个名为"MyThread1"
的线程上运行,那么就做某些事情”。
现在终于我们对你的问题有了明确的陈述....
如何根据线程的名称或线程ID向线程发送通知?
假设您的意思是等待/通知样式通知,那么通常情况下,您不能。
通过对某个对象进行Object.notify()
调用来发送通知,并由另一个当前在同一对象上的Object.wait()
调用中被阻塞的线程接收。
- 如果在没有线程等待时进行通知调用,则它将丢失。
- 如果对错误的对象进行通知调用,则它将丢失。
通常,任意线程都不会以这种方式通知。 它将做其他事情。 可以基于其名称或ID识别线程这一事实实际上是不重要的。
你应该在这里做的是:
- 确定所需的通知方式。 同步与异步? 保证交货与否? 1对1还是1对多? 是否通过了其他信息?
-
为“通知”选择最合适的原语。
例如:
- 等待/通知
- 信号灯
- 障碍/闩锁
- 队列/队列
- 锁
- interupts
- 诸如此类
- 设计您的应用程序,以便有一个Map或某些东西,它将从一个线程的名称映射到相应的“通知通道”对象以通知它。 或者更好的是,不要。