我有一个实现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的所有访问,而不仅仅是写访问。您可以通过添加同步的 setter/getter isShouldRun来实现此目的,而不是直接在此行上访问shouldRun:

while (isShouldRun())

或者,您可以将shouldRun设为volatile

未能执行此操作可能导致一个线程在另一个线程中没有注意到而更改了shouldRun的值。

09-25 22:24