- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我是 Java 多线程的新手,遇到过以下问题:
问题:线程 1 到 n 执行一个名为 critical() 的方法。在此之前,他们执行一个名为 uncritical() 的方法。它们的同步约束是一次只能执行一个critical(),所有线程必须在critical()之前完成执行uncritical()> 可以调用。您可以假设 n 存储在可从所有线程访问的变量 n 中。为线程设计一个同步机制。所有线程必须执行相同的代码。线程可能会多次调用 critical(),您应该确保线程不能调用 critical() (k+1) 次,直到所有其他线程都已完成对 critical() 的 kth 调用。
这是一个想法(我可能完全错了):
public class CriticalMonitor{
public static int N = 0;
public CriticalMonitor(int )
public void uncritical(int threadID){
System.out.println(“Thread ” + threadID+“: Uncritical!”);
N--;
if(N== 0) notifyAll();
}
public synchronized void critical(int threadID){
while(N!=0){
try{
wait();
}catch(InterruptedException e){
System.out.println(“Critical failed”);
}
}
System.out.println(“Thread ” + threadID+“: Critical!”);
}
}
public static class CriticalThread extends Thread{
private final CriticalMonitor monitor;
private int threadId;
public CriticalThread (CriticalMonitor m, int id){
monitor = m;
monitor.N++;
threadId = id;
}
public void run(){
monitor.uncritical(threadId);
//random number of calls to critical()?
int rand = (int)(Math.random()*5);
while(rand>=0){
monitor.critical(threadId);
rand--;
}
}
}
我无法解决的问题是如何确保所有其他线程在线程调用 之前完成对 critical() 的 kth 调用critical() (k+1) 次。
最佳答案
您可以创建一个 CyclicBarrier线程数n
。
critical()
之前调用 uncritical()
,您可以让屏障在 critical()
之前 await
。当所有 n 个线程都执行完 uncritical()
后,它们将一起跳闸。critical()
,他们应该调用 await
。所以在每一轮中,每个线程都会让屏障知道他们已经到达了那个点。最后一个到达后,所有线程将一起进入下一轮。wait-notify
,只需在 critical()
方法上使用 syncronize
关键字来保护它一次只能由一个线程执行。代码应该是这样的。
public class CriticalThread extends Thread {
private final CriticalMonitor monitor;
private int threadId;
private CyclicBarrier barrier;
public CriticalThread(CriticalMonitor m, int id, CyclicBarrier barrier) {
monitor = m;
monitor.N++;
threadId = id;
this.barrier = barrier;
}
public void run() {
monitor.uncritical(threadId);
//random number of calls to critical()?
try {
barrier.await();
int rand = (int) (Math.random() * 5);
int time = 0;
int limit = 5;
while (time < limit) {
if (rand > 0) {
monitor.critical(threadId);
rand--;
}
barrier.await();
time++;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
首先,您需要设置为AtomicInteger
以保证内存可见性。在每个 critical
中,您需要递减 N,而在循环中递增 N。
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class CriticalMonitor {
public static int SOURCE_N = 0;
public static AtomicInteger N = new AtomicInteger(SOURCE_N);
public static ReentrantLock lock = new ReentrantLock(true);
public static Condition condition = lock.newCondition();
public void uncritical(int threadID) {
System.out.println("Thread " + threadID + ": Uncritical!");
N.getAndDecrement();
if (N.get() == 0) {
lock.lock();
try {
condition.signalAll();
} finally {
lock.unlock();
}
}
}
public void critical(int threadID) {
lock.lock();
try {
while (N.get() != 0) {
try {
condition.await();
} catch (InterruptedException e) {
System.out.println("Critical failed");
}
}
System.out.println("Thread " + threadID + ":Critical !");
N.getAndDecrement();
} finally {
lock.unlock();
}
}
}
关键线程
while(rand >= 0){
monitor.critical(threadId);
rand--;
N.getAndIncrement();
if (N.get() == 0) {
lock.lock();
try {
condition.signal();
} finally {
lock.unlock();
}
}
}
关于java - 确保所有其他线程在线程调用 critical() (k+1) 之前完成了对 critical() 的第 k 次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48588568/
这基本上是 the code I am using灯塔说我的(几乎是空的!)css 包延迟了我的初始加载。 那么我如何在 中放置指向 critical.scss 的链接 DONT_WANT_TO_WR
这实际上是三个不同的概念还是我混淆了? (我一直在阅读有关线程和垃圾收集的文章,但我自己也很困惑。) “关键部分” - 我认为这可能只是您不希望多个线程同时访问的代码部分的术语,即在 lock 和 M
好吧,过去一天我一直在绞尽脑汁试图解决这个问题。我正在尝试为目录中的每个 HTML 文件生成关键 CSS。我当前的工作代码在单个文件上运行良好: export const criticalCSS =
我是 Java 多线程的新手,遇到过以下问题: 问题:线程 1 到 n 执行一个名为 critical() 的方法。在此之前,他们执行一个名为 uncritical() 的方法。它们的同步约束是一次只
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
CRITICAL_SECTION 和 CCriticalSection 之间有什么关系。CCriticalSection 是 CRITICAL_SECTION 的包装器吗? 顺便说一句: 我认为下面的
我正在尝试使用 openMP,并且我有一个永远不能同时运行两次的功能。在另一个世界中,这不是问题: int foo(void){ mutex->lock(); .... mutex->relea
我有多个项目的并行构建,每个项目在某个时间点都会调用 任务。此 exec 任务正在运行 3pty 工具,如果此工具的另一个实例正在运行,该工具会崩溃。有没有一些本地方法如何在 msbuild 中实现“
换句话说:你写了什么代码 不能 失败。我很想听听那些从事过心脏监测器、水测试、经济基本面、导弹轨迹或航天飞机上的 O2 浓度的项目的人的意见。 你是如何准备编写这种代码的:方法论、智力和情感? 编辑
所以我最近开始使用 Perl::Critic 来检查我编写的代码的质量。我正在以残酷的模式运行它,并且它提出了一个我不认为是问题的建议。输出是: 标记函数的返回值被忽略 - 在第 197 行第 13
我已经开始将一个项目转换为 Moose,我注意到的第一件事是我的批评/整洁测试陷入困境。 Moose、Tidy 和 Critic 似乎不像以前那么喜欢彼此了。 是否有任何关于如何让评论家/整洁者更欣赏
案例一: 场景:我有两种不同的方法,每种方法都共享通用的全局资源。 Method1() 被 ThreadA 访问,Method2() 被许多其他线程访问,但不是 ThreadA。 要求 :我的要求是如
我正在尝试使用 Keras 和 Tensorflow 实现 Actor-Critic。但是,它永远不会收敛,我不明白为什么。我降低了学习率,但它没有改变。 代码在python3.5.1和tensorf
一旦我们的软件投入使用,“关键”机器信息将被记录并用于调试目的。 “关键”信息可能包括对调试应用程序“通常”很重要的数据。它可能包括: 操作系统 已安装 Windows 更新 硬件信息:CPU、内存、
我正在编写一个小型数据库接口(interface)并想使用 glayout。 MWE: require(gWidgets) options("guiToolkit"="RGtk2") ### Th
考虑以下代码 //proces i: //proces j: flag[i] = true;
我在另一个线程(由 threading.Thread 创建)中运行一个单独的类方法。我想检查用户是否登录成功。 如果用户没有登录,我想提示一个消息框 QtWidgets.QMessageBox.cri
我在线程 A 中有以下代码,它使用 pthread_cond_wait() 阻塞 pthread_mutex_lock(&my_lock); if ( false == testConditi
我正在寻找对“关键渲染路径”含义的简明解释,特别是关于它与 Web 开发的关系。 最佳答案 The critical rendering path is the series of events th
每当我的独立线程在特定的 .txt 文件中遇到单词“alert1”时,我想显示一条错误消息。但是我在 mythread.cpp 文件中的 monitorForAlerts() 中得到了上述错误。如果我
我是一名优秀的程序员,十分优秀!