2013-12-17 27 views
0

我學習Java和有關線程和有這樣的代碼:Java併發和範圍

Integer target = (int) (Math.random() * 1000); 
    System.out.println("The number is " + target); 
    Monitor mThread = new Monitor(); 
    mThread.start(); 

    Finder finder1 = new Finder(0,249,target,mThread); 
    Finder finder2 = new Finder(250,499,target,mThread); 
    Finder finder3 = new Finder(500,749,target,mThread); 
    Finder finder4 = new Finder(750,1000,target,mThread); 

    Thread t1 = new Thread(finder1,"T1"); 
    t1.start(); 
    mThread.addThread(t1); 
    Thread t2 = new Thread(finder2,"T2"); 
    t2.start(); 
    mThread.addThread(t2); 
    Thread t3 = new Thread(finder3,"T3"); 
    t3.start(); 
    mThread.addThread(t3); 
    Thread t4 = new Thread(finder4,"T4"); 
    t4.start(); 
    mThread.addThread(t4); 

取景器類接受範圍和數量進行檢查,看它是否在這個範圍內。運行代碼時,在Finder中使用最終變量之前,只有最後一個數字範圍纔會用於測試。

我以爲新的Finder會實例化一個全新的對象,爲什麼finder4的變量在finder4的範圍中改變?

+5

顯示Finder類的代碼。 –

+0

Maurício說什麼。在Finder的實現中,這個問題非常明顯。它幾乎聽起來像你正在初始化的字段是靜態的。 – Mumbleskates

回答

1

我認爲新的Finder會實例化一個全新的對象,爲什麼finder4的變量在finder4的範圍內改變?

如果值實例字段(即,不static)然後finder4不應該訪問finder1 S場。說new Finder(...)肯定會實例化一個全新的對象。

線程的輸出是否有可能以不同於您預期的順序返回?可能是finder1的線程在finder4之後開始或結束,因此您剛剛在處看到結果

1

您是否有一些代碼正在等待線程完成?難道只有使用finder1的線程有足夠的時間來完成計算並在退出程序之前打印結果?

0

整數是不可變的,所以你必須引用Finder類中的另一個變量。

沒有Finder的代碼很難回答你錯了什麼,但最好的猜測是你使用共享變量來存儲目標,然後他們可以相互改變。原始值永遠不會改變,只是在重新分配的過程中丟失。