Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何根据线程的名称或id向其发送通知?可能吗?_Java_Multithreading - Fatal编程技术网

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

Java 如何根据线程的名称或id向其发送通知?可能吗?,java,multithreading,Java,Multithreading,上下文:java线程间通信 如何根据线程的名称或id向其发送通知? 可能吗 我们不能用Java与特定线程通信, 我们不知道调度器何时将CPU分配给线程。 那么Thread类的方法public void setName(String name)、public String getName()和public int getId()的目的是什么呢 这些方法只帮助开发人员识别线程,或者我们可以将其用于线程间通信 以上代码是否有效 不,不是Thread是一个类名,但Thread.getName()是一个实

上下文:java线程间通信

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

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

这些方法只帮助开发人员识别线程,或者我们可以将其用于线程间通信

以上代码是否有效

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

但是,这是有效的:

if (Thread.currentThread().getName().equals("MyThread1")){
     //MyThread1 specific code here
}
现在还不清楚这是否符合你的预期。在任何意义上,它肯定不会与线程通信。它只是说,“如果我在一个名为
“MyThread1”
的线程上运行,那么请执行某些操作”


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

如何根据线程的名称或线程id向其发送通知

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

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

  • 如果在没有线程等待时发出notify调用,那么它将丢失
  • 如果对错误的对象进行了notify调用,则它将丢失
一般来说,任意线程不会以这种方式通知。它将做其他的事情。事实上,可以根据线程的名称或id来识别线程并不重要

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

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

  • 好吧,你可以通过编程。有了它,您可以
    start()
    it、
    run()
    it、获取它的状态、堆栈跟踪、
    join()
    it、
    interrupt()
    。这显然是线程间通信。因此,是的,如果您知道某个线程的名称,您可以与该线程通信


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

    “我们无法通信特定的线程,对吗?”我不明白你在问什么。@Stephen我可以用java通信特定的线程吗?仍然没有意义。Java不“通信”线程,在非技术意义上也没有意义。我能做吗?啊!所以您>>实际上“MyThread1”是示例线程名,它处于可运行状态thread poolAgreed,我只使用线程名调试和检查日志。同意Timo:我在日志中使用线程名,以检查是否是发生异常的调度程序,还是HTTP请求。