首页 > 应用开发 > > java 多线程实现加减交替运算 结果与预期不符
java 多线程实现加减交替运算 结果与预期不符
package calc;
/**
* @author : S K Y
* @version :0.0.1
*/
class Resource { //定义一个操作的资源
private int num = 0; //定义要进行加减操作的数据
/*flag = true 表示可以进行加法操作,无法进行减法操作
* flag = false 表示可以进行减法操作,无法进行加法操作*/
private boolean flag = true;
public synchronized void add() throws InterruptedException {
if (!this.flag) { //现在需要执行的是减法操作,加法操作需要等待
super.wait();
}
Thread.sleep(100);
this.num++;
System.out.println("[加法操作-" + Thread.currentThread().getName() + "]num = " + this.num+ " " + this.flag);
this.flag = false;
super.notifyAll();
}
public synchronized void sub() throws InterruptedException {
if (this.flag) { //现在进行的是减法操作,加法操作需要等待
super.wait();
}
Thread.sleep(200);
this.num--;
System.out.println("[减法操作-" + Thread.currentThread().getName() + "]num = " + this.num + " " + this.flag);
this.flag = true;
super.notifyAll();
}
}
class AddThread implements Runnable {
private Resource resource;
public AddThread(Resource resource) {
this.resource = resource;
}
@Override
public void run() {
for (int i = 0; i < 50; i++) {
try {
this.resource.add();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class SubThread implements Runnable {
private Resource resource;
public SubThread(Resource resource) {
this.resource = resource;
}
@Override
public void run() {
for (int i = 0; i < 50; i++) {
try {
this.resource.sub();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class MyCalculation {
public static void main(String[] args) {
Resource resource = new Resource();
AddThread addThread = new AddThread(resource);
SubThread subThread = new SubThread(resource);
new Thread(addThread, "加法线程A").start();
new Thread(addThread, "加法线程B").start();
new Thread(subThread, "减法线程A").start();
new Thread(subThread, "减法线程B").start();
}
}发现做最终运行结果如下:
[加法操作-加法线程A]num = 1 true
[减法操作-减法线程B]num = 0 false
[加法操作-加法线程B]num = 1 true
[减法操作-减法线程A]num = 0 false
[加法操作-加法线程A]num = 1 true
[减法操作-减法线程B]num = 0 false
[减法操作-减法线程A]num = -1 true
[加法操作-加法线程B]num = 0 true
[减法操作-减法线程A]num = -1 false
[减法操作-减法线程B]num = -2 true
[加法操作-加法线程A]num = -1 true
[减法操作-减法线程B]num = -2 false
[减法操作-减法线程A]num = -3 true
[加法操作-加法线程B]num = -2 true
[减法操作-减法线程A]num = -3 false
[减法操作-减法线程B]num = -4 true
[加法操作-加法线程A]num = -3 true
[减法操作-减法线程B]num = -4 false
[减法操作-减法线程A]num = -5 true
[加法操作-加法线程B]num = -4 true
[减法操作-减法线程A]num = -5 false是什么原因会产生这样的现象呢?
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/1727/viewspace-3146883/ ,如需转载,请注明出处,否则将追究法律责任。