Java:线程中断时更改对象属性

时间:2014-12-09 12:08:22

标签: java multithreading

是否可以在线程中断时更改对象属性?

当我点击一个单元格我想要中断一个线程并将其中一个属性的值更改为单击的单元格时,我有一个板(单元矩阵)

    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 个答案:

答案 0 :(得分:1)

每个线程都有自己的指令指针和callstack,以便线程知道它当前在代码中的位置。

线程没有自己的内存。所有线程共享相同的内存,这意味着您可以从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();
        }
    }

 }

答案 1 :(得分:0)

您可以捕获中断的异常,但不建议这样做进行线程间通信。您应该使用 wait() notify()来同步对资源的访问权限。