如何使用3個線程分3步計算表達式(a + b) × a ÷ 2的值

範例:多線程分步運算方式

使用3個線程分3步計算表達式(a + b) × a ÷ 2的值
每個線程具備1個隊列存儲分步運算的中間結果,3個線程共享同一個消息對象進行數據交換
由隊列的阻塞功能和寫入消息到3個不同隊列的操作順序來決定表達計算的先後順序


package com.contoso;

public class Message {
    public double a;
    public double b;
    public String expr = null;
}

 

package com.contoso;

// 如何使用3個線程分3步計算表達式(a + b) × a ÷ 2的值
// 每個線程具備1個隊列存儲分步運算的中間結果,3個線程共享同一個消息對象進行數據交換
// 由隊列的阻塞功能和寫入消息到3個不同隊列的操作順序來決定表達計算的先後順序
public class App {

    public static void main(String[] args) {
        new Thread(new Plus()).start(); // 計算b = a + b
        new Thread(new Multiply()).start(); // 計算a = b × a
        new Thread(new Divide()).start(); // 計算a = a ÷ 2

        for (int i = 1; i <= 1000; i++) {
            for (int j = 1; j <= 1000; j++) {
                Message msg = new Message();
                msg.a = i;
                msg.b = j;
                msg.expr = "(a + b) × a ÷ 2 = (" + i + "+" + j + ")×" + i + "÷2";
                Plus.mq.add(msg);  // 第1步計算b = a + b
            }
        }
    }
}
package com.contoso;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class Plus implements Runnable {

    public static BlockingQueue<Message> mq = new LinkedBlockingQueue<Message>();

    @Override
    public void run() {
        while (true) {
            try {
                Message msg = mq.take();
                msg.b = msg.a + msg.b;
                Multiply.mq.add(msg);  // 第2步計算a = b × a
            } catch (InterruptedException e) {
            }
        }
    }
}
package com.contoso;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class Multiply implements Runnable {

    public static BlockingQueue<Message> mq = new LinkedBlockingQueue<Message>();

    @Override
    public void run() {
        while (true) {
            try {
                Message msg = mq.take();
                msg.a = msg.a * msg.b;
                Divide.mq.add(msg); // 第3步計算a = a ÷ 2
            } catch (InterruptedException e) {
            }
        }
    }
}

 

package com.contoso;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class Divide implements Runnable {

    public static BlockingQueue<Message> mq = new LinkedBlockingQueue<Message>();

    @Override
    public void run() {
        while (true) {
            try {
                Message msg = mq.take();
                msg.a = msg.a / 2;
                System.out.println(msg.expr + " = " + msg.a); // 打印輸出計算結果
            } catch (InterruptedException e) {
            }
        }
    }
}
run:
(a + b) × a ÷ 2 = (1+1)×1÷2 = 1.0
(a + b) × a ÷ 2 = (1+2)×1÷2 = 1.5
(a + b) × a ÷ 2 = (1+3)×1÷2 = 2.0
(a + b) × a ÷ 2 = (1+4)×1÷2 = 2.5
(a + b) × a ÷ 2 = (1+5)×1÷2 = 3.0
(a + b) × a ÷ 2 = (1+6)×1÷2 = 3.5
(a + b) × a ÷ 2 = (1+7)×1÷2 = 4.0
(a + b) × a ÷ 2 = (1+8)×1÷2 = 4.5
(a + b) × a ÷ 2 = (1+9)×1÷2 = 5.0
(a + b) × a ÷ 2 = (1+10)×1÷2 = 5.5
(a + b) × a ÷ 2 = (1+11)×1÷2 = 6.0
(a + b) × a ÷ 2 = (1+12)×1÷2 = 6.5
(a + b) × a ÷ 2 = (1+13)×1÷2 = 7.0
(a + b) × a ÷ 2 = (1+14)×1÷2 = 7.5
(a + b) × a ÷ 2 = (1+15)×1÷2 = 8.0
(a + b) × a ÷ 2 = (1+16)×1÷2 = 8.5
(a + b) × a ÷ 2 = (1+17)×1÷2 = 9.0
(a + b) × a ÷ 2 = (1+18)×1÷2 = 9.5
(a + b) × a ÷ 2 = (1+19)×1÷2 = 10.0
(a + b) × a ÷ 2 = (1+20)×1÷2 = 10.5
(a + b) × a ÷ 2 = (1+21)×1÷2 = 11.0
(a + b) × a ÷ 2 = (1+22)×1÷2 = 11.5
(a + b) × a ÷ 2 = (1+23)×1÷2 = 12.0
(a + b) × a ÷ 2 = (1+24)×1÷2 = 12.5
(a + b) × a ÷ 2 = (1+25)×1÷2 = 13.0
(a + b) × a ÷ 2 = (1+26)×1÷2 = 13.5
(a + b) × a ÷ 2 = (1+27)×1÷2 = 14.0
(a + b) × a ÷ 2 = (1+28)×1÷2 = 14.5
(a + b) × a ÷ 2 = (1+29)×1÷2 = 15.0
(a + b) × a ÷ 2 = (1+30)×1÷2 = 15.5
(a + b) × a ÷ 2 = (1+31)×1÷2 = 16.0
(a + b) × a ÷ 2 = (1+32)×1÷2 = 16.5
(a + b) × a ÷ 2 = (1+33)×1÷2 = 17.0
(a + b) × a ÷ 2 = (1+34)×1÷2 = 17.5
(a + b) × a ÷ 2 = (1+35)×1÷2 = 18.0
(a + b) × a ÷ 2 = (1+36)×1÷2 = 18.5
(a + b) × a ÷ 2 = (1+37)×1÷2 = 19.0
(a + b) × a ÷ 2 = (1+38)×1÷2 = 19.5
(a + b) × a ÷ 2 = (1+39)×1÷2 = 20.0
(a + b) × a ÷ 2 = (1+40)×1÷2 = 20.5
(a + b) × a ÷ 2 = (1+41)×1÷2 = 21.0
(a + b) × a ÷ 2 = (1+42)×1÷2 = 21.5
(a + b) × a ÷ 2 = (1+43)×1÷2 = 22.0
(a + b) × a ÷ 2 = (1+44)×1÷2 = 22.5
(a + b) × a ÷ 2 = (1+45)×1÷2 = 23.0
(a + b) × a ÷ 2 = (1+46)×1÷2 = 23.5
(a + b) × a ÷ 2 = (1+47)×1÷2 = 24.0
(a + b) × a ÷ 2 = (1+48)×1÷2 = 24.5
(a + b) × a ÷ 2 = (1+49)×1÷2 = 25.0
。。。  。。。  。。。  。。。
。。。  。。。  。。。  。。。
。。。  。。。  。。。  。。。

(a + b) × a ÷ 2 = (1000+976)×1000÷2 = 988000.0
(a + b) × a ÷ 2 = (1000+977)×1000÷2 = 988500.0
(a + b) × a ÷ 2 = (1000+978)×1000÷2 = 989000.0
(a + b) × a ÷ 2 = (1000+979)×1000÷2 = 989500.0
(a + b) × a ÷ 2 = (1000+980)×1000÷2 = 990000.0
(a + b) × a ÷ 2 = (1000+981)×1000÷2 = 990500.0
(a + b) × a ÷ 2 = (1000+982)×1000÷2 = 991000.0
(a + b) × a ÷ 2 = (1000+983)×1000÷2 = 991500.0
(a + b) × a ÷ 2 = (1000+984)×1000÷2 = 992000.0
(a + b) × a ÷ 2 = (1000+985)×1000÷2 = 992500.0
(a + b) × a ÷ 2 = (1000+986)×1000÷2 = 993000.0
(a + b) × a ÷ 2 = (1000+987)×1000÷2 = 993500.0
(a + b) × a ÷ 2 = (1000+988)×1000÷2 = 994000.0
(a + b) × a ÷ 2 = (1000+989)×1000÷2 = 994500.0
(a + b) × a ÷ 2 = (1000+990)×1000÷2 = 995000.0
(a + b) × a ÷ 2 = (1000+991)×1000÷2 = 995500.0
(a + b) × a ÷ 2 = (1000+992)×1000÷2 = 996000.0
(a + b) × a ÷ 2 = (1000+993)×1000÷2 = 996500.0
(a + b) × a ÷ 2 = (1000+994)×1000÷2 = 997000.0
(a + b) × a ÷ 2 = (1000+995)×1000÷2 = 997500.0
(a + b) × a ÷ 2 = (1000+996)×1000÷2 = 998000.0
(a + b) × a ÷ 2 = (1000+997)×1000÷2 = 998500.0
(a + b) × a ÷ 2 = (1000+998)×1000÷2 = 999000.0
(a + b) × a ÷ 2 = (1000+999)×1000÷2 = 999500.0
(a + b) × a ÷ 2 = (1000+1000)×1000÷2 = 1000000.0

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章