Java中如何通知特定线程

2024-03-17

如何在线程间通信中调用特定线程?

在下面的程序中我有两个线程t1 and t2.

当我打电话时t1.notify()它提出:

Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
    at java.lang.Object.notify(Native Method)
    at Shared.methodTwo(NotifyThread.java:43)
    at Thread2.run(NotifyThread.java:77)
Error 

class Shared {

    Thread1 t1 ;
    Thread2 t2 ;

    void ThreadInit( Thread1 t1 , Thread2 t2 ) {
        this.t1 = t1 ;
        this.t2 = t2 ;
    }

    synchronized void methodOne()
    {
        Thread t = Thread.currentThread();

        System.out.println(t.getName()+" is relasing the lock and going to wait");

        try
        {
            wait();        //releases the lock of this object and waits
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }

        System.out.println(t.getName()+" got the object lock back and can continue with it's execution");
    }

    synchronized void methodTwo()
    {
        Thread t = Thread.currentThread();

        try
        {
            Thread.sleep(5000);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }

        t1.notify();     

        System.out.println("A thread which is waiting for lock of this object is notified by "+t.getName());
    }
    }

    class Thread1 extends Thread 
    {
    Shared s ;
    Thread1( Shared s ) {

        this.s = s ;
    }

    public void run()
            {
                s.methodOne();   //t1 calling methodOne() of 's' object
            }

    } 

    class Thread2 extends Thread {
         Shared s ;
    Thread2( Shared s ) {

        this.s = s ;

    }

    public void run()
            {
                s.methodTwo();   //t1 calling methodOne() of 's' object
            }


    }
    public class NotifyThread 
    {
    public static void main(String[] args)
    {
        final Shared s = new Shared();

        Thread1 t1 = new Thread1(s) ;
        Thread2 t2 = new Thread2(s) ;

        s.ThreadInit(t1,t2) ;

        t1.start();
        t2.start();
    }
}

You don't / can't notify a specific thread. You call notify() on a lock object. This wakes up one of the threads1 that is waiting on the lock. In your case, the lock object is a Thread ... which rather confuses the picture. However, see below.

但是你的问题(IllegalMonitorStateException)发生是因为执行通知的线程(即current线程)不持有锁。当前线程在通知锁时必须持有锁,这是一个(硬)要求。

有关更多详细信息,请阅读 javadocsObject.wait(timeout)或(例如)这个:http://howtodoinjava.com/core-java/multi-threading/how-to-work-with-wait-notify-and-notifyall-in-java/ http://howtodoinjava.com/core-java/multi-threading/how-to-work-with-wait-notify-and-notifyall-in-java/

1 - If multiple threads are waiting on your lock, one thread is chosen "randomly" by the scheduler. Alternatively notifyAll will wake up all of the waiting threads.


我不会使用Thread对象作为锁对象。它可能会起作用,但也有可能其他东西(可能是运行时系统中的某些东西)也在锁定/等待/通知Thread对象。那么事情就会变得非常混乱。

(事实上​​,阅读javadoc https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Thread.html#join(long) for Thread.join(long) !)

最好专门为此目的创建锁对象;例如

private final Object lock = new Object();

另外,编写扩展的课程Thread通常是一个坏主意。通常最好实施Runnable接口,实例化它,并将实例作为参数传递给Thread构造函数;例如

Thread t = new Thread(new Runnable() {
    public void run() {
        System.out.println("Hello world");
    }});
t.start();

实施的好处之一Runnable而不是延伸Thread是您可以更轻松地使用代码来管理线程生命周期;例如一个ExecutorService、 fork-join 线程池或经典线程池。

第二个是轻量级线程逻辑可以简洁地实现为匿名类......就像我的示例一样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中如何通知特定线程 的相关文章

  • Java 旋转图像

    Override public void paintComponent Graphics g super paintComponent g Graphics2D g2 Graphics2D g create rotation of play
  • 找不到参数的方法 dependencyResolutionManagement()

    我正在尝试使用老师给我的一个项目 但它显示了一个错误 Settings file Users admin AndroidStudioProjects HTTPNetworking settings gradle line 1 A probl
  • 用更轻的解决方案替换完整的 ORM(JPA/Hibernate):推荐的加载/保存模式?

    我正在开发一个新的 Java Web 应用程序 并且正在探索保存数据的新方法 对我来说是新方法 我主要有 JPA 和 Hibernate 的经验 但是 除了简单的情况之外 我认为这种完整的 ORM 可能会变得相当复杂 另外 我不太喜欢和他们
  • 使用 enum.values() 与字符串数组相比,性能是否会受到影响?

    我正在使用枚举来替换String我的 java 应用程序 JRE 1 5 中的常量 当我在不断调用的方法中将枚举视为名称的静态数组时 例如 在渲染 UI 时 是否会对性能造成影响 我的代码看起来有点像这样 public String get
  • jdbctemplate计数queryForInt并传递多个参数

    如何传入多个参数jdbcTemplate queryForInt得到计数 我试过这个 Integer count this jdbcTemplate queryForInt select count name from table name
  • Java:用于确定等效性的外部类?

    Java 有一个Comparator
  • 使用 JaxRS 自定义 JSON 序列化

    在 Web 服务调用中 我想返回具有此 JSON 结构的对象 date 30 06 2014 price val 12 50 curr EUR 我想将此 JSON 代码映射到此 Java 结构 使用乔达时间 http www joda or
  • GSON 中的自定义反序列化?

    我需要创建一个自定义反序列化器 以便我可以正确反序列化我以此格式收到的日期 2011 10 19T23 30 00 04 00 我的 Date 对象是许多字段之一 包含我正在反序列化的对象的许多嵌套类之一 除了日期之外 一切正常 我的班级是
  • PESSIMISTIC_WRITE 是否锁定整个表?

    只是为了确保我正确理解事情是如何运作的 If I do em lock employee LockModeType PESSIMISTIC WRITE 它会仅阻止该实体吗 employee 或整个表Employees 如果重要的话 我正在谈
  • 使用 async/await 抛出和捕获异常的正确方法

    全部请拿下面的二维码 Task
  • 在 JUnit 中使用 Spring 测试服务时如何回滚数据库事务?

    我测试我的 DAO 和服务没有问题 但是当我测试时INSERTs or UPDATE我想回滚事务而不影响我的数据库 我在用着 Transactional在我的服务中管理交易 我想知道 是否有可能知道事务是否正常 但回滚它以防止更改数据库 这
  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c

随机推荐

  • 使用 BFS 进行加权图

    我正在修改单源最短路径算法 在视频中 老师提到BFS DFS不能直接用于查找最短路径 in a 加权图 我想每个人都知道这一点 并说自己找出原因 我想知道为什么它不能用于加权图的确切原因 解释 是由于边缘的重量还是其他原因造成的 有人可以解
  • 每个用户轨道的日期范围重叠

    如何使用下面的代码验证每个用户的日期 当我以其他用户身份登录时 我无法创建具有相同日期的预订 我有 user id 引用表 users 中的 id 我希望能够使 date start 和 date end 仅对用户唯一 并且仍然能够与不同的
  • 在 ARM 模板中引用 KeyVault 机密失败,并显示“模板中未定义资源”

    我正在尝试在 Azure Web 应用程序的 AppConfig 部分中创建 KeyVault 引用 KeyVault 引用引用了 KeyVault 中存在的机密 该密钥属于不同资源组 因此模板中不存在 根据文档 https learn m
  • 制作可前后移动的可定制 LCG

    我将如何让 LCG 伪随机数生成器的类型 在两个方向上移动 我知道前进是 a x c m但我怎样才能扭转它呢 我使用这个 所以我可以将种子存储在地图中玩家的位置 并能够通过在 LCG 中向后和向前传播 就像某种随机数线 来生成它周围的东西
  • 在 MVP 中,谁应该处理导航?

    我相信 Presenter 是负责处理 MVP 应用程序的导航方面的人 这是真的还是有例外 我认为视图是唯一负责屏幕导航的视图 Here https medium com nbarishok on navigation in android
  • 如何使用 Python 将 png 并排放置到 HTML 表格中

    我有一个 matplotlib 图转换为 png figure new savefig figure new png bbox inches tight pad inches 0 and a styler objectreport newt
  • 接受连续点的电子邮件的正则表达式

    这是我的正则表达式 a zA Z0 9 lt gt s lt gt s a zA Z0 9 0 9 1 3 0 9 1 3 0 9 1 3 0 9 1 3 a zA Z 0 9 a zA Z 2 例如 上述正则表达式接受电子邮件本地部分中的
  • 检查标志位java

    我的标志位有问题 我有一个int保存标志的变量 首先 我为该变量设置了一些标志 稍后我需要检查该变量中设置了多少个标志 但我不知道该怎么做 要检查是否设置了位值 int value VALUE TO CHECK OTHER VALUE TO
  • 检查 Java 字符串中的字母大小写(大写/小写)

    我遇到的问题是我无法让我的密码验证程序检查字符串以确保其中 1 个字符为大写字母 1 个字符为小写字母 它将检查整个字符串中的其中一个other 并根据正在检查的语句打印错误消息 我查看了这个网站和互联网来寻找答案 但找不到答案 这是家庭作
  • PHP 中 Trait 和抽象类的区别

    我最近遇到Traits http php net manual en language oop5 traits php在 PHP 中 我试图理解它们 在我的研究过程中 我偶然发现了这个 Stack Overflow 问题 特性与接口 htt
  • 在 NetBeans 7.1.1 中创建 UML 类图

    我想安装 启用 NetBeans 插件来创建和查看 UML 图 如图所示here http wiki netbeans org wiki images b b8 Vista Nimbus Uml Screenshot NBLookAndFe
  • Jackson 支持 java 8 Stream() 吗?

    我想用杰克逊的树模型 http wiki fasterxml com JacksonTreeModel使用 Java 8 流 API 如下所示 JsonNode jn new ObjectMapper readValue src JsonN
  • 如何在 CSS 中保留空格但忽略换行符?

    The white spaceCSS 3 中的属性有pre wrap值 它将保留空格和换行符 并在必要时换行 并且pre linevalue 它会折叠空白 但保留换行符 并在必要时换行 它能做什么not不过 有一个值果酱空白和崩溃换行 同时
  • C++ 中的最佳 XML 库,快速设置

    我想知道 C 中最好的 XML 库 我正在使用 Visual Studio 是什么 考虑到快速设置至关重要 基本上 我想创建一个文件来保存各种 avi 文件的注释 先感谢您 你应该能够得到TinyXML http www grinningl
  • 异步/等待清晰,以睡眠为例

    我试图通过下面的实现来掌握 async await 的窍门 但它没有按预期工作 public static async sleep ms number Promise
  • 如何在AppGallery中发布apk而不使用不同的包创建应用程序的副本

    我正在尝试在 AppGallery 上发布应用程序 但是当我在控制台项目中输入新应用程序的包名称时 它说该包已被占用 该应用程序已发布在 Play 商店上 如果您在 AppGallery 中搜索它 它会找到它 但 AppGallery 页面
  • tkinter Askstring 在其可见性更改之前被删除

    我正在尝试制作一个弹出窗口 人们可以在其中填写输入框中的字符串 我已经经历了很多例子 但它不起作用 我正在尝试这样做 var entry simpledialog askstring Test Test 我收到此错误消息 tkinter T
  • 如何从 Web 浏览器(客户端)建立 TCP Socket 连接?

    我读过关于WebSockets但它们似乎并不是纯粹的 套接字 因为它们之上有一个应用层协议 ws 有没有什么方法可以从网络浏览器进行纯套接字连接 以使网页活跃起来 这是我在黑暗中随机刺伤的 Java提供的Applets套接字 需要安装jav
  • “因特征而异”未按预期工作

    根据我的理解 正如答案中所解释的这个问题 https stackoverflow com questions 39890055 what is vary for traits in xcode 8您可以为您想要的任何设备调整情节提要上的任何
  • Java中如何通知特定线程

    如何在线程间通信中调用特定线程 在下面的程序中我有两个线程t1 and t2 当我打电话时t1 notify 它提出 Exception in thread Thread 1 java lang IllegalMonitorStateExc