ITPub博客

首页 > 应用开发 > > java 多线程实现加减交替运算 结果与预期不符

java 多线程实现加减交替运算 结果与预期不符

作者:daqianmen 时间:2019-08-16 14:26:19 0 删除 编辑

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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-07-31

  • 博文量
    108
  • 访问量
    34266