我正在嘗試同步3個線程。它們中的每一個都處理沿着它自己的路徑移動的履帶。 不幸的是他們的路徑是這樣交叉的: 線程 - 使用標誌解鎖並嘗試/終於
爲了實現這個目標,我使用了鎖。共有兩個區塊:水平和垂直(我將它命名爲上面和下面)。問題是一個線程在同一時間想要在兩個共享部分。
我的問題是:
我可以解鎖使用標誌的try/finally從句裏面的鎖?
我的意思是,當一個線程解鎖try/finally子句中的一個鎖時,會設置一個標誌,並在finally子句中檢查該標誌是否設置,然後再次解鎖。我認爲這是一個安全的解決方案,但也許我錯了。
是否有任何其他方式來同步線程?
這是我的代碼:(它幾乎適用)
public void moveForward() throws InterruptedException {
redIsUpofAbove();
int choose= 0;
if (Route.critcalSectionAbove.contains(head))
choose= 1;
if (Route.critcalSectionBelow.contains(head))
choose= 2;
switch (choose) {
case 1: {
boolean flag = true;
System.err.println(name + " Lock above");
synchronization.aboveLock.lock();
try {
takeNextGrid();
Thread.sleep(sleepValue);
while (isInAboveCriticalSection()) {
takeNextGrid();
Thread.sleep(sleepValue);
if (isInBelowCriticalSection()) {// Caterpillar is on two
// shared sections
System.out.println(name + " Lock below");
if (!synchronization.belowLock.tryLock()) {
synchronization.aboveLock.unlock();
System.out.println(name + " Unlock above");
synchronization.belowLock.lock();
flag = false;
}
try {
while (isInBelowCriticalSection()) {
takeNextGrid();
if (!isInAboveCriticalSection() && flag) {
synchronization.aboveLock.unlock();
flag = false;
System.out.println(name + " Unlock above");
}
Thread.sleep(sleepValue);
}
} catch (Exception e) {
} finally {
synchronization.belowLock.unlock();
System.err.println(name + "Unlock belovelock");
}
}
}
} catch (Exception e) {
} finally {
if (flag) {
synchronization.aboveLock.unlock();
System.out.println(name + " unlock above");
}
}
break;
}
case 2: {
boolean flag = true;
System.err.println(name + " Lock below");
synchronization.belowLock.lock();
try {
takeNextGrid();
Thread.sleep(sleepValue);
while (isInBelowCriticalSection()) {
takeNextGrid();
Thread.sleep(sleepValue);
if (isInAboveCriticalSection()) {
if (!synchronization.aboveLock.tryLock() && flag) {
synchronization.belowLock.unlock();
System.out.println(name + " Unlock below");
synchronization.aboveLock.lock();
flag = false;
}
try {
System.out.println(name + " Lock above");
while (isInAboveCriticalSection()) {
takeNextGrid();
if (!isInBelowCriticalSection() && flag == true) {
synchronization.belowLock.unlock();
flag = false;
System.out.println(name + " Lock below");
}
Thread.sleep(sleepValue);
}
} catch (Exception e) {
} finally {
synchronization.aboveLock.unlock();
System.err.println(name + "Lock abovelock");
}
}
}
} catch (Exception e) {
} finally {
if (flag) {
synchronization.belowLock.unlock();
System.out.println("Opuszczam belowLock");
}
}
break;
}
default: {
takeNextGrid();
break;
}
}
}
最後一個問題:
有沒有一種方法來設置優先級醒來,在其上等待的線程一個鎖定的鎖?
謝謝你的回答,這是非常有用的和有用的。 我想到了你的提示,並得出結論,它是正確的算法。我已經實施了它,並且......它的工作!這個練習的概念是使用單獨的線程並同步它們。我非常密切,但鎖上的信號燈變成我需要的東西。 再次感謝您。 – TomaszGrzybowski