我有一个实现 Runnable 的 java 对象。这是代码。
public class Obj implements Runnable {
boolean shouldRun;
private int stuff
public Obj() {
this.setshouldRun(true);
stuff = 0;
}
public synchronized void setshouldRun(boolean shouldRun) {
this.shouldRun = shouldRun;
}
public synchronized boolean getshouldRun() {
return this.shouldRun;
}
@Override
public void run() {
while (shouldRun) {
//do stuff
}
}
}
下面是我如何使用 Obj。
Obj o = new Obj();
//q is a collection of Obj
q.add(o);
new Thread(o).start();
当我想删除 o 时,我可以安全地这样做吗:
o.setshouldRun(false); //thread will finish
q.remove(o);
最佳答案
您需要同步对 shouldRun 的所有访问,而不仅仅是写访问。您可以通过添加一个同步的 getter isShouldRun
而不是直接在此行访问 shouldRun 来做到这一点:
while (isShouldRun())
或者你可以让 shouldRun volatile .
如果不这样做,可能会导致一个线程对 shouldRun 值的更改不会在另一个线程中被注意到。
关于Java对象实现Runnable,如何从集合中移除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1786939/