当线程被中断时是否可以更改对象属性?
我有一个板(单元矩阵),当我单击一个单元格时,我想中断一个线程并将其属性之一的值更改为单击的单元格
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/