繁体   English   中英

Java:线程之间的变量同步

[英]Java: synchronization of variables between threads

我试图以以下方式启动/停止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 <= 2时,所有内容才能按预期工作。否则,尽管isActive应该返回false,但某些线程会继续其输出。 那至少是我的期望。

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

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

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;
    }
}

您的操作方式存在竞争状况。

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

当您说“开始”时,您说的是线程已准备好执行,但run方法此时未启动(它在调度程序说起时启动)。 因此,很可能首先执行this.active = false,然后陷入无限循环。

什么没有按预期工作?

除了您的活动成员之外,我没有看到任何在线程间同步的东西,它没有真正共享,因为它是私有的……而且由于唯一修改它的方法将其设置为false。

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

如果希望线程在停止之前做至少一件事,则可以将while循环切换为do:

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

那么每个线程在检查是否应该停止之前都会做一些事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM