Java:线程之间的变量同步

时间:2010-11-11 23:15:47

标签: java multithreading

我正在尝试以下列方式启动/停止Java线程。

public class ThreadTester {
    public static void main(String[] args) {
        MyThread mt;
        int max = 3;

        for (int i = 0; i < max; i++) {
            mt = new MyThread();
            mt.start();
            mt.finish();
        }
    }
}

public class MyThread extends Thread {
    private volatile boolean active;

    public void run() {
        this.active = true;
        while (isActive()) {
            System.out.println("do something");
        }
    }

    public void finish() {
        this.active = false;
    }

    public boolean isActive() {
        return active;
    }
}

只有当max&lt; = 2时,一切都按预期工作。否则一些线程继续输出,尽管isActive应该返回false。这至少是我的期望。

问题:在“master”和“slave”线程之间同步变量的正确方法是什么?

3 个答案:

答案 0 :(得分:7)

您应该在声明期间将active初始化为true,而不是在运行方法中。

public class MyThread extends Thread {
    private volatile boolean active = true;

    public void run() {
        // this.active = true;
        while (isActive()) {
            // do nothing
        }
    }

    public void finish() {
        this.active = false;
    }
}

你这样做的方式存在竞争条件。

此外,安全停止线程的更好方法是使用中断。

答案 1 :(得分:2)

当你说开始时你说这个线程已经准备好执行但是run方法不会在那一刻开始(它在调度程序说的时候开始)。所以,你很可能首先这样做.active = false而不是陷入无限循环。

答案 2 :(得分:0)

什么不能按预期工作?

我没有看到任何内容在线程之间同步,除了你的活动成员,它没有真正共享,因为它的私有...并且因为修改它的唯一方法将其设置为false。

我唯一可以看到的是你可能在你的线程运行之前调用finish,随着你增加线程的数量,这种情况越来越可能发生。

如果您希望线程在停止之前至少执行一项操作,则可以将while循环切换为do:

do
{
    // do nothign at least once
}
while( active );

然后每个线程在检查它是否应该停止之前会做一些事情。