如何在两个线程之间共享数据

1,如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,卖票系统就可以这么做。 

2,如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,例如,设计4个线程。其中两个线程每次对j增加1,另外两个线程对j每次减1,银行存取款

每个线程执行的代码相同,可以使用同一个Runnable对象

public class RunnalbleTest2 implements Runnable {
    private int threadCnt = 10;

    @Override
    public void run() {
        while (true) {
            if (threadCnt > 0) {
                System.out.println(Thread.currentThread().getName() + " 剩余个数 " + threadCnt);
                threadCnt--;
                try {
                    Thread.sleep(30);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } else {
                break;
            }
        }
    }

    public static void main(String[] args) {
        RunnalbleTest2 runnalbleTest2 = new RunnalbleTest2();
        new Thread(runnalbleTest2).start();
        new Thread(runnalbleTest2).start();
    }
}

结果

Thread-0 剩余个数 10
Thread-1 剩余个数 10
Thread-0 剩余个数 8
Thread-1 剩余个数 7
Thread-0 剩余个数 6
Thread-1 剩余个数 5
Thread-0 剩余个数 4
Thread-1 剩余个数 3
Thread-0 剩余个数 2
Thread-1 剩余个数 1

每个线程执行的代码不同,用不同的Runnable对象

#

public class Acount {
    private int money;
    Acount(int money) {
        this.money = money;
    }

    public synchronized void getMoney(int money) {
        while (this.money < money) {
            System.out.println("余额不足");
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        this.money -= money;
        System.out.println("取出" + money + ",还剩" + this.money);
    }

    public synchronized void setMoney(int money) {
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        this.money += money;
        System.out.println("新存入" + money + ",总额:" + this.money);
        notify();

    }

    public static void main(String[] args) {
        Acount acount = new Acount(0);
        Bank bank = new Bank(acount);
        Consumer consumer = new Consumer(acount);
        new Thread(bank).start();
        new Thread(consumer).start();

    }
}

#

import java.util.Random;

public class Bank implements Runnable{
    Acount acount;
    public Bank(Acount acount) {
        this.acount = acount;
    }

    @Override
    public void run() {
        while(true) {
            int random = (int)(Math.random() * 1000);
            acount.setMoney(random);
        }
    }
}

#

public class Consumer implements Runnable{
    Acount acount;

    Consumer(Acount acount) {
        this.acount = acount;
    }

    @Override
    public void run() {
        while (true) {
            int random = (int)(Math.random() * 1000);
            acount.getMoney(random);
        }
    }

}

结果

新存入442,总额:442
余额不足
新存入196,总额:638
新存入815,总额:1453
取出534,还剩919
新存入402,总额:1321
取出719,还剩602
取出11,还剩591
....

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值