如何确保打印偶数奇数的两个线程在此实现中保持先偶后奇的顺序?

2023-12-27

我创建了两个可运行的作业:PrintEvenNumbersJob 和 PrintOddNumbersJob,并生成了两个线程来执行这些作业。这似乎工作得很好!但我对这个实施感到有些可疑。我可以对这个实施有一些意见和建议吗?

我在这个实现中看到的问题是,只有当 thread1 首先获得对象锁的锁时,程序才会终止,否则它会打印奇数第一偶数第二顺序,并且不会终止,除非我在之后提供另一个语句“lock.notify” PrintEvenNumbersJob 中的 for 语句(如本实现中所示)。我的问题是如何确保 thread1 首先执行。

public class PrintEvenNumbersJob implements Runnable {

private Object lock;

public PrintEvenNumbersJob(Object lock) {
    this.lock = lock;
}

@Override
public void run() {
    synchronized (lock) {
        for (int i = 0; i <= 10; i += 2) {

            lock.notify();

            System.out.println(i);

            try {
                lock.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
        lock.notify(); // not required if thread1 gains lock first
    }
}

}


public class PrintOddNumbersJob implements Runnable {

private Object lock;

public PrintOddNumbersJob(Object lock) {
    this.lock = lock;
}

@Override
public void run() {
    synchronized (lock) {
        for (int i = 1; i < 10; i += 2) {

            lock.notify();

            System.out.println(i);

            try {
                lock.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
        lock.notify();
    }
}

}



public class EvenOddManager {

public static void main(String[] args) {

    Object lock = new Object();

    PrintEvenNumbersJob printEvenNumbersJob = new PrintEvenNumbersJob(lock);
    PrintOddNumbersJob printOddNumbersJob = new PrintOddNumbersJob(lock);

    Thread thread1 = new Thread(printEvenNumbersJob);
    Thread thread2 = new Thread(printOddNumbersJob);

    thread2.start();
    thread1.start();

}

}

您尝试过使用信号量吗?这更容易,因为你不需要担心 wait 和 notification 的调用顺序(如果你在 wait 之前调用 notification,它就会“丢失”)

示例代码:

import java.util.concurrent.*;

public class Test {

    private final Semaphore oddJobPermits = new Semaphore(0);
    private final Semaphore evenJobPermits = new Semaphore(1);

    private class EvenJob implements Runnable {
        public void run() {
            for (int i = 0; i < 10; i++) {
                try {
                    evenJobPermits.acquire();
                    System.out.println(i * 2);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } finally {
                    oddJobPermits.release();
                }
            }
        }
    }

    private class OddJob implements Runnable {
        public void run() {
            for (int i = 0; i < 10; i++) {
                try {
                    oddJobPermits.acquire();
                    System.out.println(i * 2 + 1);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } finally {
                    evenJobPermits.release();
                }
            }
        }
    }

    public void run() {
        new Thread(new EvenJob()).start();
        new Thread(new OddJob()).start();
    }

    public static void main(String[] args) {
        new Test().run();
    }

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

如何确保打印偶数奇数的两个线程在此实现中保持先偶后奇的顺序? 的相关文章

  • Mockito:如何通过模拟测试我的服务?

    我是模拟测试新手 我想测试我的服务方法CorrectionService correctPerson Long personId 实现尚未编写 但这就是它将执行的操作 CorrectionService将调用一个方法AddressDAO这将
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • jdbc mysql loginTimeout 不起作用

    有人可以解释一下为什么下面的程序在 3 秒后超时 因为我将其设置为在 3 秒后超时 12秒 我特意关闭了mysql服务器来测试mysql服务器无法访问的这种场景 import java sql Connection import java
  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • Java ResultSet 如何检查是否有结果

    结果集 http java sun com j2se 1 4 2 docs api java sql ResultSet html没有 hasNext 方法 我想检查 resultSet 是否有任何值 这是正确的方法吗 if resultS
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp
  • Java中super关键字的范围和使用

    为什么无法使用 super 关键字访问父类变量 使用以下代码 输出为 feline cougar c c class Feline public String type f public Feline System out print fe

随机推荐

  • PHP 7.x 使用 MAMP 与 MSSQL 服务器连接

    我正在尝试通过 MAMP 将 mssql 服务器连接到 PHP 7 0 8 我尝试过使用 freetds 在一些博客上人们说使用pdo dblib so扩展 但它不起作用 请指导我完成连接过程 对于仍然遇到此问题的人 Application
  • 使 sympy 表达式中的所有符号可交换

    假设 sympy 表达式中有许多非交换符号 例如 a c sympy symbols a c commutative False b sympy Symbol b expr a c b c 使表达式中的所有符号可交换的首选方式是什么 例如
  • 使用 lambda 作为函数指针时,模板参数推导/替换失败

    我想知道为什么在下面的代码中编译器无法使用 lambda 作为函数 foo 的参数 模板参数推导 替换失败 而一个简单的函数却可以工作 template
  • Datomic 中的 SQL LIKE 运算符

    我想运行一个 sql 查询 给定一个搜索关键字 将找到所有用户 其中他们的名字与该模式匹配 即在原始 SQL 中类似WHERE users name LIKE foo 我该怎么做呢 查询的当前结构 gt defn find users db
  • 传单用户触发事件

    有什么方法可以确定事件是通过编程方式触发还是由用户触发 我们希望在地图移动或缩放时重新加载标记列表 但我们最初使用以下命令设置地图的边界setBounds http leafletjs com reference html rectangl
  • 使用 plyr 将参数传递给 R 函数

    我无法解决一个问题 想写一个这样的函数 f describe lt function data var by require plyr res lt ddply data by summarize N sum is na var Mean
  • 如何在react-native android应用程序中显示GIF?

    我想通过我的 android 反应本机应用程序中的图像标签中的 URL 显示一个简单的 gif 但是当我启动它时 没有显示图像 中提供的代码docs https facebook github io react native docs im
  • 在屏障实现中将代码从顺序一致性更改为不太严格的排序

    我遇到了这段代码 用于简单地实现屏障 对于无法使用的代码std experimental barrier在 C 17 中或std barrier在 C 20 中 在 C Concurrency in Action 一书中 编辑 屏障是一种同
  • 我们如何在azure应用程序洞察中显示数据库查询

    我们的应用程序正在使用天蓝色的应用程序见解 我读到的是 使用应用程序洞察端到端跟踪 我们甚至可以获得在数据库中执行的查询以及该查询花费了多少时间 但如屏幕截图所示 Azure App Insights 显示有 3 个对数据库的调用 但不是这
  • 将每个分隔符的值拆分为单独的行 - 批处理

    我正在尝试使用 delimiter 将 csv 文件的值拆分为单独的行 作为拆分点 IE csv file video1 video2 video3 video4 video5 video6 Preferred output video1
  • 获取 Twitter 请求令牌失败

    我按照以下说明进行操作http dev twitter com pages auth request token http dev twitter com pages auth request token 并开发了一个c 类来进行OAuth
  • 如何取消Java 8的完整未来?

    我正在玩 Java 8 completable futures 我有以下代码 CountDownLatch waitLatch new CountDownLatch 1 CompletableFuture
  • redshift - 如何插入表生成的时间序列

    我正在尝试在 Redshift 中生成时间序列并插入表中 但没有成功 到目前为止我已经尝试过 insert into date dateid date SELECT to char datum YYYYMMDD int AS dateid
  • 有没有办法判断是否显示软键盘?

    有没有办法判断软键盘是否显示在活动中 I tried InputMethodManager manager InputMethodManager getSystemService getApplicationContext INPUT ME
  • Android Camera2 API - 检测我们何时获得焦点

    因此 我设法用旧相机按照我想要的方式创建了我想要的功能 使用 mCamera autoFocus autoFocusCallback 我检测何时获得焦点并在预览模式下运行所需的代码 现在我很难掌握如何在camera2 API 中执行相同的操
  • 完整的日历适合容器并隐藏滚动

    我无法弄清楚如何缩放 fullcalendar 以适应它的父容器 我想在单个页面上为用户显示周视图 而无需滚动 因此他们可以快速查看一周的项目 如果我需要使文本变小 插槽高度变小等 我没问题 但我只是不确定如何根据浏览器窗口的大小动态地执行
  • 在 C# 中使用“out”关键字返回多个值

    我目前正在努力理解它的含义 当它说使用 out 关键字我们能够return多个值 例如 来自 msdn 站点 https msdn microsoft com en us library ee332485 aspx https msdn m
  • Python 中的通用命令模式和命令调度模式

    我正在寻找一个CommandPython 中的模式实现 根据维基百科 http en wikipedia org wiki Command pattern 命令模式是一种设计 对象用于的模式 代表并封装所有 调用方法所需的信息 稍后 我唯一
  • JS 对象文字和 JSON 字符串有什么区别?

    我对人们所说的对象文字 JSON JavaScript 对象的确切含义感到困惑 对我来说 它们看起来很相似 foo bar bar baz AFAIK 上面是对象文字 json 以及 javascript 对象 不是吗 对象字面量和 jso
  • 如何确保打印偶数奇数的两个线程在此实现中保持先偶后奇的顺序?

    我创建了两个可运行的作业 PrintEvenNumbersJob 和 PrintOddNumbersJob 并生成了两个线程来执行这些作业 这似乎工作得很好 但我对这个实施感到有些可疑 我可以对这个实施有一些意见和建议吗 我在这个实现中看到