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

标签 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 个线程访问同一个对象。如果你考虑指针,两个线程可以有一个指向相同内存地址的指针。

如果你尝试一下,你会发现这在很长一段时间内都可以正常工作。但随后,就会出现错误。原因是一个线程可能正在从对象中读取数据,而另一个线程正在写入该对象(或者两者都在写入)。为了避免这种情况,你可以告诉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();
        }
    }

 }

关于Java:线程中断时更改对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27378618/

相关文章:

java - 如何在没有关联窗口的情况下使图像出现在屏幕上

java - SpreadsheetEntry.getKey() 返回前面带有 'spreadsheet%3A' 的键

java - 如何使用Optional检查java中集合中模型的所有属性不为空?

java - 当线程运行时重新绘制 swing 组件

c++ - 通用线程池类无法正常工作

java - Android - Java - 找不到处理 Intent 的 Activity

java - 删除java图形中的绘制线

java - 销毁当前类对象并通过线程运行同一个类

swift - 更新 GMSMarkers 而不阻塞主线程

Python:在主线程中执行回调方法