同步和信号量
Synchronization and Semaphore
我正在遍历 Map ,并且有多个线程。
地图中的队列包含操作。我的目标是给每个线程一个要执行的操作..但是没有 2 个线程(或更多)可以从一个队列中 运行 2 个任务(或更多)
这意味着每个线程都将搜索一个队列,并以某种方式锁定队列并检查队列是否有操作,如果有,它 运行 是其中之一,如果没有搜索另一个队列到 运行 来自他们动作。
注意:队列数可以大于线程数
电子
我尝试在 'Map.Entry'
上同步
public void run() {
while (true) {
Action<?> act;
for (Map.Entry entry :ActionMap.entrySet()) {
Synchronized(entry)
{
act = ((Queue<Action>)entry.getValue()).poll();
if (act == null)
break;
}
}
}
}
问题是,如果另一个线程正在搜索要执行的操作,则会卡在同步行中并等待第一个线程完成任务或完成等待,这不是我想要的。
如果某个线程到达另一个线程正在处理的队列,我希望所有线程都搜索队列,只需跳过它并继续搜索
所以我四处挖掘并找到了信号量,所以我找到了这个
Semaphore Gate = new Semaphore(1);
public void run() {
while (true) {
Action<?> act;
for (Map.Entry entry :ActionMap.entrySet()) {
if( Gate.tryAcquire());
{
act = ((Queue<Action>)entry.getValue()).poll();
if (act == null){
Gate.Release();
break;
}
else {
act.handle();
Gate.Release();
}
}
}
}
}
提出问题 Gate.aquire() 会锁定所有条目
这意味着对于 2 个不同的条目和 2 个不同的线程,只有一个线程可以访问门并执行 Action
所以最后有人知道可以帮助我的设计模式吗?
谢谢...
您可以为此使用 java.util.concurrent
类型的地图。它们是线程安全的,因此您不需要 Syncronize。
同步意味着:资源(已同步)不能被多个线程同时修改。例如,Collections.synchronizedMap(Map) 返回的 MAP 将是一个同步映射,一次可以由一个线程修改,但并发集合允许多个线程根据需要在给定时间访问集合的不同部分.例如,我们有一个 ConcurentHashMap 的重载构造函数,它将输入 concurrencyLevel 作为可以同时访问集合的线程数。
我正在遍历 Map ,并且有多个线程。 地图中的队列包含操作。我的目标是给每个线程一个要执行的操作..但是没有 2 个线程(或更多)可以从一个队列中 运行 2 个任务(或更多) 这意味着每个线程都将搜索一个队列,并以某种方式锁定队列并检查队列是否有操作,如果有,它 运行 是其中之一,如果没有搜索另一个队列到 运行 来自他们动作。 注意:队列数可以大于线程数 电子 我尝试在 'Map.Entry'
上同步 public void run() {
while (true) {
Action<?> act;
for (Map.Entry entry :ActionMap.entrySet()) {
Synchronized(entry)
{
act = ((Queue<Action>)entry.getValue()).poll();
if (act == null)
break;
}
}
}
}
问题是,如果另一个线程正在搜索要执行的操作,则会卡在同步行中并等待第一个线程完成任务或完成等待,这不是我想要的。 如果某个线程到达另一个线程正在处理的队列,我希望所有线程都搜索队列,只需跳过它并继续搜索
所以我四处挖掘并找到了信号量,所以我找到了这个
Semaphore Gate = new Semaphore(1);
public void run() {
while (true) {
Action<?> act;
for (Map.Entry entry :ActionMap.entrySet()) {
if( Gate.tryAcquire());
{
act = ((Queue<Action>)entry.getValue()).poll();
if (act == null){
Gate.Release();
break;
}
else {
act.handle();
Gate.Release();
}
}
}
}
}
提出问题 Gate.aquire() 会锁定所有条目 这意味着对于 2 个不同的条目和 2 个不同的线程,只有一个线程可以访问门并执行 Action
所以最后有人知道可以帮助我的设计模式吗? 谢谢...
您可以为此使用 java.util.concurrent
类型的地图。它们是线程安全的,因此您不需要 Syncronize。
同步意味着:资源(已同步)不能被多个线程同时修改。例如,Collections.synchronizedMap(Map) 返回的 MAP 将是一个同步映射,一次可以由一个线程修改,但并发集合允许多个线程根据需要在给定时间访问集合的不同部分.例如,我们有一个 ConcurentHashMap 的重载构造函数,它将输入 concurrencyLevel 作为可以同时访问集合的线程数。