簡體   English   中英

Java中多線程的錯誤輸出

[英]incorrect output for multithreading in java

為什么有時我會得到輸出:

患者4拜訪醫生辦公室。

患者2拜訪醫生辦公室。

患者1訪問醫生辦公室。

當我期望輸出按升序排列時,即患者1,然后是患者2或3,然后是患者4或5。即,由於最初的for循環,我什至不知道在輸出4之前它如何看到打印4。主要的類是設置患者編號的方法,我立即啟動線程。

這是我的代碼:

public static void main(String[] args)
{
    NUM_P = 5;//TEMPORARILY HARD CODE, WILL TAKE ARG FROM COMMANDLINE IN THE FUTURE
    NUM_A = 2;
    Patient[] myPatients = new Patient[NUM_P];
    for (int i = 0; i < NUM_P; i++)
    {
         Patient patient = new Patient();
         patient.setPatientNumber(i);
         myPatients[i] = patient;
         myPatients[i].start();
    }
}

在病人班上

public void run() 
{
    attendParty();
    visitDoctor();
}

public void visitDoctor()
{
    System.out.println("Patient-"+(this.getPatientNumber())+" visits doctor office.");
}

public void attendParty() throws InterruptedException
{
    Random randomGen = new Random();
    int val = randomGen.nextInt(101);
    if (val < 20)
    {
        interrupt();
        //NO NEED TO CREATE A PATIENT THREAD, THE PATIENT IS NOT SICK HEHE
    }
    else
    {
        this.setSickness(true);//He is sick
    }
}

一旦啟動線程,線程何時獲得周期完全取決於VM。 不能保證它們將按照它們的開始順序運行。

當線程並行運行時,執行順序通常是不確定的。 因此,您的代碼輸出是完全正常的-您幾乎同時啟動所有線程,並且大多數情況下它們並行運行。

線程處理是由vm而不是您的代碼完成的。 這意味着系統將決定允許線程運行的時間和時間,除非您命令線程等待,休眠或讓步。 還可以選擇聲明首選項。 這些切換不會等到線程到達分號,並且(大多數情況下會)在字節碼級別的操作之間發生。 通常,除非您出於計時目的而絕對需要它,否則建議不要在代碼中干涉線程處理。 但是,只要有兩個線程訪問並更改同一資源的可能性,您就應該始終保持同步 ,以便在操作/方法/操作的中間交換線程。 會弄亂兩個線程的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM