[英]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.