我正在尝试用 Java 制作一个极其简单的“计算器”来理解线程,因为它是我为 Java 中的并发编程场景找到的实现。
它在我的类里面的呈现方式如下:
cobegin
a = a + 10
b = b - 3
coend
c = b - a
w = c + 1
我做了一些研究,并尝试在 java 中以这种方式实现它,但它对所有值返回 0。
主类 公共(public)类线程{
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
int a = 0;
int b = 0;
Threader t1 = new Threader(a, '+', 10);
System.out.println("a" + a);
Threader t2 = new Threader(b, '-', 3);
System.out.println("b" + b);
t1.start();
a = t1.res;
System.out.println("a>>thread" + a);
t2.start();
b = t2.res;
System.out.println("b>>thread" +b);
int c = b - a;
System.out.println("c" + c);
int w = c + 1;
System.out.println("w" +c);
}
应该执行线程的类
public class Threader extends Thread {
private char op;
private int a;
private int b;
public int res;
public Threader(int _a, char _op, int _b) {
a = _a;
b = _b;
op = _op;
}
@Override
public void run() {
Operator ope = new Operator();
res = ope.operar(a, op, b);
}
}
操作符类
public class Operator {
public int operar(int a, char op, int b) {
if (op == '+') {
return sum(a, b);
}
if (op == '-') {
return substr(a, b);
}
if (op == '*') {
return mult(a, b);
}
if (op == '/') {
return div(a, b);
} else {
return Integer.MAX_VALUE;
}
}
public int sum(int a, int b) {
return a + b;
}
public int substr(int a, int b) {
return a - b;
}
public int mult(int a, int b) {
return a * b;
}
public int div(int a, int b) {
if (b > 0) {
return a / b;
} else {
return Integer.MAX_VALUE;
}
}
}
我错过了什么? Java 中是否有更好的方法来解决该问题?
最佳答案
IMO,这是如何使用线程的一个糟糕示例。
关于任何线程,我总是问的第一个问题是“它等待什么?”这几乎就是任何线程的定义。服务器线程等待来自客户端的传入连接,客户端线程等待特定客户端发送下一个命令,GUI 线程等待键盘和鼠标输入,工作线程等待执行任务等。
您的线程不会等待任何事情。 (顺便说一句,您的程序中存在错误:您的主线程甚至不等待工作人员计算结果。)
您的程序是一个不寻常的异常(exception)规则的退化示例:它是一个执行单个计算的程序。在这种情况下,创建不必等待的工作线程是有意义的,因为每个线程从创建的那一刻起就知道其任务。程序创建线程,线程执行其任务,主线程等待各个结果,将它们组合起来,然后程序就完成了。
但这是一个不寻常的案例。
更典型的是,计算密集型程序将使用工作线程的池来执行许多计算。并且,这些工作线程在不主动计算时等待下一项工作。而且,这就是它们的定义。
如果您想学习如何思考线程,请考虑它们等待什么。
国际海事组织。
关于java - 简单的java线程测试程序不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32489973/