ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java之多线程的数字加减案例(同步,等待与唤醒)

2022-02-02 18:03:30  阅读:215  来源: 互联网

标签:Java 加减 线程 加法 resource 减法 多线程 super public


多线程控制数字的加减:

线程控制数字的加减过程应该是一个加一个减,这个和消费者模型有点像,加了后再减,加减不同同时进行,所以存在同步的问题。

/* 定义一个操作资源
*   这个类用来创建数值和加减切换开关还有加减的操作
*   其它线程类则创建这个类的属性来进行关联,并调用这个类中的方法实现加减的操作。
* */
public class Resource {
    private int num = 0;    // 进行加减操作的数据
    private boolean flag =true; // 加减的切换
    // flag = true : 表示可以进行加法操作,不能减法操作
    // flag = false : 表示可以进行减法操作,不能加法操作
    public synchronized void add(){ // 加法操作,已同步
        if (this.flag == false){    // 现在需要执行的是减法操作,加法操作需要等待
            try {
                super.wait();   // super 表示父类,wait()是Object的方法所以super指向的是Object
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //延迟
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        this.num ++;
        System.out.println("【加法操作】- " + Thread.currentThread().getName() + ": num = " + this.num);
        // 因为flag = true执行加法,所以将flag设置为false执行减法
        this.flag = false;      // 加法操作执行完毕,需要进行减法操作
        // super 表示父类,notifyAll()是Object的方法所以super指向的是Object
        super.notifyAll();      // 等待的可能是加法或者减法,那么就唤醒全部线程
    }
    public synchronized void sub(){ // 减法操作,已同步
        if (this.flag == true){    // 现在需要执行的是加法操作,减法操作需要等待
            try {
                super.wait();   // super 表示父类,wait()是Object的方法所以super指向的是Object
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //延迟
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        this.num --;
        System.out.println("【减法操作】- " + Thread.currentThread().getName() + ": num = " + this.num);
        this.flag = true;   // true:执行加法
        super.notifyAll();      // super 表示父类,notifyAll()是Object的方法所以super指向的是Object
    }

}

 

// 加法线程
public class AddThread implements Runnable{
    private Resource resource;
    public AddThread(Resource resource){
        this.resource = resource;
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            this.resource.add();
        }
    }
}

 

// 减法线程
public class SubThread implements Runnable{
    private Resource resource;
    public SubThread(Resource resource){
        this.resource = resource;
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            this.resource.sub();
        }
    }
}

 

// 客户端
public class Main {
    public static void main(String[] args) {
        Resource res = new Resource();          //创建资源类对象
        AddThread at = new AddThread(res);      //创建加法线程类对象
        SubThread st = new SubThread(res);      //创建减法线程类对象
        new Thread(at,"加法线程 - A").start();
        new Thread(at,"加法线程 - B").start();
        new Thread(st,"减法线程 - A").start();
        new Thread(st,"减法线程 - B").start();
    }
}

输出结果:

 

num的值最终为0,加减法的交替进行得以验证,但是因为线程优先级的问题,无法保证某一个方法的某个线程先执行。

 

标签:Java,加减,线程,加法,resource,减法,多线程,super,public
来源: https://www.cnblogs.com/0099-ymsml/p/15860542.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有