簡體   English   中英

Java:線程中斷時更改對象屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM