我有一个从网上下载一些文件的runnable,它看起来如下:
class Downloader implements Runnable {
volatile Status status;
public void run() {
// ...
while (status.isInProgress()) { ... }
}
}
状态如下:
public enum Status {
PAUSED {
public int someData() { return 0; }
},
INPROGRESS {
public int someData() { return 1; }
}
public abstract int someData();
private String msg;
public String getSomeMsg() {
return msg;
}
public void setSomeMsg(String s) {
msg=s;
}
public boolean isInProgress() {
return this == INPROGRESS;
}
}
当用户按下暂停按钮时,状态变量从GUI线程设置为PAUSED.
代码是用java 1.6编译的,并且是为Android平台编译的.
我的问题是,这样设置/读取Enum是否可以线程安全?我在这里读了很多文章:
而且我确信这是拯救,但它并没有说明很多关于枚举的内容.
解决方法:
因此,对于this页面,可以使用包含基元和对象的volatile(包括枚举).此外,这是挥发性关键字的典型用法,如您所见,here.
注意:假设你的循环在完成后会中断(因为你没有定义DONE枚举值),最坏的情况是(i)用户暂停和(ii)下载在下一次迭代之前完成.在这种情况下,用户单击暂停,但看到“下载完成”消息.
标签:java,android
来源: https://codeday.me/bug/20190620/1247640.html