範例:多線程分步運算方式
使用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