java - Java中带有信号量的多线程状态
问题描述
我有一个关于在多线程 Java 代码中使用信号量的问题。
There are three threads being fired asynchronously. One of them calls zero(), the other calls even(), and the last one calls odd(). "0102" is the correct output.
Semaphore zero = new Semaphore(1);
Semaphore odd = new Semaphore(0);
Semaphore even = new Semaphore(0);
public void zero(IntConsumer printNumber) throws InterruptedException {
for(int i = 0; i < n; i++) {
zero.acquireInterruptibly();
printNumber.accept(0);
if(i % 2 == 0) {
odd.release();
} else {
even.release();
}
}
}
public void even(IntConsumer printNumber) throws InterruptedException {
for (int i = 2; i <= n; i += 2) {
even.acquire();
printNumber.accept(i);
zero.release();
}
}
public void odd(IntConsumer printNumber) throws InterruptedException {
for (int i = 1; i <= n; i += 2) {
odd.acquire();
printNumber.accept(i);
zero.release();
}
}
在上面显示的代码中,将运行的第一个函数是函数“零”,因为只需要那个锁。然后,函数 'odd' 将能够从另一个线程调用,因为它的锁已被释放,因此能够被获取。
两个问题:
1) 在锁被函数 'odd' 释放之前,获得“零”锁的同一个线程能否重新进入 for 循环
2) 在线程被切换后,for 循环的状态如何保存?
编辑:在更多地了解信号量时,我知道无论线程之前是否已获取信号量,它都无法运行,除非该信号量可用的许可数量大于 0。因此,直到数量可用许可的数量大于 0,则该函数将无法运行,直到释放该信号量以使可用许可的数量大于 0。但问题仍然存在,如何保持 for 循环的状态如此当我重新进入 for 循环时,我不会从最初的 'i' 值开始。
解决方案
推荐阅读
- android - 无法将 Firebase 添加到 LibGDX 项目
- azure - 当 Windows 服务停止时,如何在 OMS 中创建警报?
- java - svnant 更新单个文件并跳过错误
- php - 如何在以键值为基础的多维数组中加入信息?
- c# - FolderBrowserDialog 添加自定义根名称
- java - 将 IntStream.iterate 限制为特定值
- bash - 用于自动化 repo 镜像的 GIT 命令
- algorithm - (logn + 3n) 的大 O 表示法是什么
- vue.js - 打印 vueJS 组件或转换为 pdf
- amazon-web-services - 运行 AWS Golang Lambda 时出现 exec 格式错误