[英]Java: change object attribute when thread is interrupted
線程中斷時是否可以更改對象屬性?
單擊單元格時,我有一塊木板(單元格矩陣),我想中斷一個線程並將其屬性之一的值更改為所單擊的單元格
if(!clickedCell.isSnake()) {
for(Snake snake : board.getSnakeList()) {
if(snake.isSelected()) {
snake.interrupt();
}
}
}
有可能捕獲到中斷異常
try{
//some code;
} catch (InterruptedException ex){
// how do i catch the cell's x and y here so that i can do something like
// snake.setFinalCell(clickedCell);
}
finally{
notifyAll();
}
謝謝。
每個線程都有自己的指令指針和調用堆棧,以便線程知道當前在代碼中的位置。
線程不會獲得自己的內存。 所有線程共享相同的內存,這意味着您可以從2個線程訪問同一對象。 如果您考慮使用指針,則兩個線程都可以具有指向相同內存地址的指針。
如果您只是嘗試一下,就會發現它可以長期工作。 但是,然后會出現錯誤。 原因是一個線程可能正在從對象讀取,而另一個線程正在向對象寫入(或兩者都在寫入)。 為了避免這種情況,您可以告訴Java只有一個線程可以同時訪問一個對象
synchronized(lockObject) {
// Access shared variables and other shared resources
}
如果是您的示例,則可以執行以下操作(偽代碼):
class CellSynchronizer {
Object lockObject = new Object();
Cell currentCell;
void setCurrentCell(Cell cell) {
synchronized (lockObject) {
currentCell=cell;
}
}
boolean isSelected() {
synchronized (lockObject) {
return currentCell.isSelected();
}
}
}
您可以捕獲中斷的異常,但是不建議使用這種方式進行線程間通信。 您應該使用wait()和notify()同步對資源的訪問。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.