簡體   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