以下是一个使用线程计算表达式的Java程序示例,该表达式忽略操作顺序:
import java.util.concurrent.*;
public class ExpressionCalculator {
public static void main(String[] args) throws InterruptedException {
String expression = "2 + 3 * 4 - 6 / 2";
// 创建线程池
ExecutorService executorService = Executors.newFixedThreadPool(4);
// 创建一个阻塞队列来存储表达式中的操作数和操作符
BlockingQueue queue = new LinkedBlockingQueue<>();
// 将表达式按空格分割成操作数和操作符,并放入队列中
String[] tokens = expression.split(" ");
for (String token : tokens) {
queue.offer(token);
}
// 创建四个线程来执行加法、减法、乘法和除法操作
executorService.execute(new OperatorThread(queue, "+"));
executorService.execute(new OperatorThread(queue, "-"));
executorService.execute(new OperatorThread(queue, "*"));
executorService.execute(new OperatorThread(queue, "/"));
// 等待所有线程执行完毕
executorService.shutdown();
executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
// 打印最终结果
System.out.println("计算结果:" + queue.poll());
}
static class OperatorThread implements Runnable {
private BlockingQueue queue;
private String operator;
public OperatorThread(BlockingQueue queue, String operator) {
this.queue = queue;
this.operator = operator;
}
@Override
public void run() {
try {
while (true) {
String token1 = queue.take();
if (token1.equals(operator)) {
String token2 = queue.take();
String token3 = queue.take();
// 执行操作
int result;
switch (operator) {
case "+":
result = Integer.parseInt(token2) + Integer.parseInt(token3);
break;
case "-":
result = Integer.parseInt(token2) - Integer.parseInt(token3);
break;
case "*":
result = Integer.parseInt(token2) * Integer.parseInt(token3);
break;
case "/":
result = Integer.parseInt(token2) / Integer.parseInt(token3);
break;
default:
throw new IllegalArgumentException("Unsupported operator: " + operator);
}
// 将计算结果放回队列
queue.offer(String.valueOf(result));
} else {
// 将操作数放回队列
queue.offer(token1);
}
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
这个程序使用一个线程池创建四个线程来执行加法、减法、乘法和除法操作。它通过一个阻塞队列来存储表达式中的操作数和操作符,并在每个操作符线程中进行处理。
每个操作符线程从队列中取出一个操作数,如果是当前线程负责处理的操作符,则再取出两个操作数进行计算,并将结果放回队列。如果是其他线程负责处理的操作符,则将操作数放回队列等待其他线程处理。
最终,在主线程中等待所有线程执行完毕后,从队列中取出最终结果并打印出来。
注意:这个示例程序中没有处理括号,只适用于没有括号的简单表达式。如果要支持括号,需要在处理操作符的线程中添加相应的逻辑来处理括号。