Java对象实现Runnable,如何从集合中移除对象

标签 java multithreading thread-safety

我有一个实现 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/

相关文章:

java - apache poi 错误 zip 文件已关闭

multithreading - TCustomClientDataSet CloneCursor 线程安全吗?

java - 纯 Java : How do i know if my thread is sleeping or not?

java - 在某个线程中的 jaBehaviorSubject 上运行 doOnNex

Java,与对象无关的 null 返回

java - Linux环境下缺少步骤插件 Pentaho

java - 在Java中连接数组?

multithreading - 线程终止(再次…)

ruby-on-rails - Rails 中类变量的线程安全性 - 这行得通吗?

thread-safety - asio隐式链和数据同步