簡體   English   中英

與線程相關的程序不起作用

[英]Threads related program not working

我正在嘗試為線程運行以下程序,並期望變量對象應由兩個不同的線程更新。 非常奇怪的是,它僅顯示值“加法-1”和“乘-2”。 但是,當我使用調試器並逐步調試它時,“加法”和乘法正按預期發生。 如果我將“ Thread.sleep”放在“ P”的“運行”方法中1000毫秒。 工作正常。 我已經注釋掉了“ Thread.sleep”的代碼,但是如果您取消注釋並運行它,則會發現預期的結果。 有人可以向我澄清一下嗎?

public class TestingThreads {   

    public static void main(String[] args) {

        Variable b = new Variable();
        Thread tp = new Thread(new P(b));
        Thread tq = new Thread(new Q(b));
        tp.start();
        tq.start();
        try {
            tp.join();
            tq.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

class Variable {
    int i = 0;
    boolean on = true;

    public synchronized void addition() {
        if (!on) {
            try {
                wait();
            } catch (InterruptedException e) {

                e.printStackTrace();
            }

        }
        i = i + 1;
        on=false;
        notify();
        System.out.println("addition " + i);



    }

    public synchronized void multiply() {

        if (on) {
            try {
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
        i = i * 2;
        on=true;
        notify();
        System.out.println("multiply " + i);

    }

}

class P implements Runnable {

    Variable b;

    P(Variable b) {
        this.b = b;
    }


    @Override
    public void run() {


        while (true) {
            /*uncomment it and it will work fine.*/

            /*try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }*/

            b.addition();

        }
    }

}

class Q implements Runnable {

    Variable b;

    Q(Variable b) {
        this.b = b;
    }

    @Override
    public void run() {

        while (true) {

            b.multiply();
        }
    }
}

您正在達到整數的頂部並環繞。 查看每個操作的前后值:

addition pre: 0
addition post: 1
multiply pre: 1
multiply post: 2
addition pre: 2
addition post: 3
multiply pre: 3
multiply post: 6
addition pre: 6
addition post: 7
multiply pre: 7
multiply post: 14
addition pre: 14
addition post: 15
multiply pre: 15
multiply post: 30
addition pre: 30
addition post: 31
multiply pre: 31
multiply post: 62
addition pre: 62
addition post: 63
multiply pre: 63
multiply post: 126
addition pre: 126
addition post: 127
multiply pre: 127
multiply post: 254
addition pre: 254
addition post: 255
multiply pre: 255
multiply post: 510
addition pre: 510
addition post: 511
multiply pre: 511
multiply post: 1022
addition pre: 1022
addition post: 1023
multiply pre: 1023
multiply post: 2046
addition pre: 2046
addition post: 2047
multiply pre: 2047
multiply post: 4094
addition pre: 4094
addition post: 4095
multiply pre: 4095
multiply post: 8190
addition pre: 8190
addition post: 8191
multiply pre: 8191
multiply post: 16382
addition pre: 16382
addition post: 16383
multiply pre: 16383
multiply post: 32766
addition pre: 32766
addition post: 32767
multiply pre: 32767
multiply post: 65534
addition pre: 65534
addition post: 65535
multiply pre: 65535
multiply post: 131070
addition pre: 131070
addition post: 131071
multiply pre: 131071
multiply post: 262142
addition pre: 262142

...

multiply pre: 1073741823
multiply post: 2147483646
addition pre: 2147483646
addition post: 2147483647
multiply pre: 2147483647
multiply post: -2
addition pre: -2
addition post: -1
multiply pre: -1
multiply post: -2
addition pre: -2

睡眠會發生同樣的事情,只是速度要慢得多。 :)

暫無
暫無

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

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