promotion image of download ymail app
Promoted
NASA 發問時間: 電腦與網際網路程式設計 · 5 年前

關於Synchronize threads print 的問

有個程式 我要累積加總

import java.util.concurrent.*;

public class Exercise32_04 {

private Integer sum = new Integer(0);

public static void main(String[] args) {

Exercise32_04 test = new Exercise32_04();

System.out.println("What is sum ? " + test.sum); //---->如果我要print 為什麼不//能用 SumTask.sum ?

}

public Exercise32_04() {

ExecutorService executor = Executors.newFixedThreadPool(1000);

for (int i = 0; i < 1000; i++) {

executor.execute(new SumTask());

}

executor.shutdown();

}

class SumTask implements Runnable {

public void run() {

int value = sum.intValue() + 1;

sum = new Integer(value);

}

}

}

已更新項目:

class SumTask implements Runnable {

public void run() {

runner.toGet();

}

}

2 個已更新項目:

public static class runner {

private static Lock lock = new ReentrantLock();

public static void toGet(){

try{

lock.lock();

int value = sum.intValue() + 1;

sum = new Integer(value);

}

catch(Exception ex){}

3 個已更新項目:

我後來改這樣行了

請問一下針對 runner.toGet()

為何下面的 runner class lock toGet()要全部改為靜態(static) ?

否則就會出現錯誤的訊息 ?

困擾我很久

謝謝

2 個解答

評分
  • Lv 4
    5 年前
    最佳解答

    建議您將私有物件( sum )

    private Integer sum = new Integer(0);

    改成 private static Integer sum = new Integer(0);

    便可以呼叫了

    因為 您 是在 靜態的方法內 呼叫 sum

    public static void main(String[] args) {

    .............

    ............................

    所以物件也要靜態.....

    2015-02-24 20:13:57 補充:

    1. Exercise32_04 是個有主程式入口的類別 而 SumTask 只是 Exercise32_04 的內部類別

    因為 SumTask 並非靜態 所以不會因為 sum 不是靜態 而會無法編譯 .

    2015-02-24 20:15:07 補充:

    1. Exercise32_04 是個有主程式入口的類別 而 SumTask 只是 Exercise32_04 的內 部類別 因為 SumTask 並非靜態 所以不會因為 sum 不是靜態 而會無法編譯 .

    2015-02-24 20:18:02 補充:

    要在靜態的方法內 不使用 Exercise32_04 而直接存取非靜態的 sum .在java 的編譯是不被允許的..這是java的規定.

    2015-02-24 20:18:57 補充:

    2.//---->如果我要print 為什麼不能用 SumTask.sum ? >>>>>> SumTask 和 sum .都只是 Exercise32_04 內的物件 .所以直接呼叫就可以了 .

    2015-02-24 20:20:21 補充:

    3.若不想要加上 static 成為靜態物件.可以使用該物件所屬的類別直接產生物件去呼叫 例如 System.out.println("What is sum ? " + new Exercise32_04().sum);

    參考資料: 經驗
    • Commenter avatar登入以對解答發表意見
  • 吉他
    Lv 5
    5 年前

    因為sum 是class Exercise32_04的member,再來是sum 被宣告為private,因此是不可以在static method或其他非inner class去點出來使用,請去加強自己的物件導向觀念~

    • Commenter avatar登入以對解答發表意見
還有問題?馬上發問,尋求解答。