我有两个线程:第一个是渲染线程,第二个线程是我处理UI动作的主线程。
我得到以下错误:
java。util。java上的ConcurrentModificationException。util。AbstractList$SimpleListator。接下来(AbstractList.java:95)在com上。对流塔。Android棋盘。棋盘。renderGamerPieces(ChessBoard.java:424)位于com。康瓦克塔。Android棋盘。棋盘。在com上渲染(ChessBoard.java:162)。康瓦克塔。Android棋盘。棋子线。运行(ChessDrawThread.java:41)
ConcurrentModification异常的常见原因是迭代列表的更改,但我只在renderGamerPieces
函数中读取它。mGamerPieces
唯一可能更改的地方是loadPosition
方法,但是loadPosition
和renderGamerPieces
都在同步块内调用
也许我不明白。。那么这个错误是如何出现的呢?
我的代码:
private final List<DrawablePiece> mGamerPieces = new ArrayList<DrawablePiece>();
private final Object mGamerPiecesLock = new Object();
public void loadPosition(byte[] pieces, byte[] places) {
synchronized (mGamerPiecesLock) {
mPicked = null;
mGamerPieces.clear();
for (int i = 0; i < pieces.length; i++) {
byte p = GamerUtils.UncastleRook(pieces[i]);
if (p != GamerPieces.EMPTY) {
byte pl = places[i];
if (pl <= GAME_BOARDSIZE)
mGamerPieces.add(new DrawablePiece(p,
GamerUtils.columnByCell(pl), GamerUtils.rowByCell(pl,
true)));
}
}
}
}
public void renderGamerPieces(Canvas canvas) {
...
Rect r = new Rect(0, 0, mCellSize, mCellSize);
List<DrawablePiece> over = new ArrayList<DrawablePiece>();
for (DrawablePiece d : mGamerPieces) {
if (d.isFloating()) {
over.add(d);
} else {
r.offsetTo(invert(d.getBoardCol()) * mCellSize,
invert(d.getBoardRow()) * mCellSize);
r.offset(mBoardRegion.left, mBoardRegion.top);
Bitmap pic = mPieceFactory.getBitmapPiece(d.getPiece(),
mCellSize);
if (null != pic)
canvas.drawBitmap(pic, null, r, null);
}
}
...
}
public void render(Canvas canvas) {
...
synchronized (mGamerPiecesLock) {
renderGamerPieces(canvas);
}
...
}
谢谢你的评论!我将整理我的代码-在renderGamerPieces
中添加同步块,并检查是否可以从另一个同步块调用loadPotion
。
我通过使同步块尽可能小来进行代码重构,问题就解决了。显然,随后有一个从一个同步块到另一个同步块的呼叫。
问题内容: 我使用迭代器遍历一个集合,如下所示: 但是在下面的行中,我得到了ConcurrentModificationException 当我不进行任何更改时,为什么会发生这种情况? 非常感谢 编辑-堆栈跟踪: 问题答案: 您必须修改列表之一: 在方法中的迭代器内部,而无需使用迭代器上的或方法;要么 在另一个线程中 因此,您的例外是预期的行为。从该文档,如果你有一个线程遍历列表: 如果在创建迭代
} 正如您所看到的,RetryHandler扩展了线程,该线程在内部列表上迭代。尽管使用了和,我还是得到了和已在其他
从CSV文件中,我读取每一行并创建一个employee对象,然后将其存储到employee的ArrayList中。 在对员工的排序之前: 一旦文件处理完成,我就开始对员工的。 循环迭代器示例: 我的迭代器的实现可能是不正确的,这是第一次直接使用迭代器。
使用Maven引导2。 在我的一个项目中,我们有一个单元测试用例,它在CI/CD和我的一台笔记本电脑中运行良好。 而在我的笔记本电脑中设置相同的项目,却返回了奇怪的异常。 pom.xml Java版本: openjdk版本“11.0.10”2021-01-19 LTS openjdk运行时环境Corretto-11.0.10.9.1(build 11.0.10+9-LTS)openjdk 64位服
问题内容: 错误: 这是什么问题 问题答案: 某处正在修改。我怀疑它可能在此调用内发生: 编辑 基本上,发生的是通过 另一个 迭代器进行的递归修改。这使得外部迭代器的故障快速行为得以解决。 __
我正在使用面临的问题是,当我运行下面的代码时,我得到了。 据我所知,代码应该毫无例外地终止。 有人能帮我理解为什么我会得到这个例外吗。