博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何在两个线程之间共享数据
阅读量:5227 次
发布时间:2019-06-14

本文共 2964 字,大约阅读时间需要 9 分钟。

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 剩余个数 10Thread-1 剩余个数 10Thread-0 剩余个数 8Thread-1 剩余个数 7Thread-0 剩余个数 6Thread-1 剩余个数 5Thread-0 剩余个数 4Thread-1 剩余个数 3Thread-0 剩余个数 2Thread-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....

 

 

转载于:https://www.cnblogs.com/kaituorensheng/p/9503425.html

你可能感兴趣的文章
js 原型链
查看>>
linux常用命令:sort 命令
查看>>
单元测试Junit4
查看>>
祝贺博文《软件开发高手须掌握的4大SQL精髓语句(综合篇)》三天内获得3500多次浏览...
查看>>
SQL Server 内存不足引起的并发症
查看>>
【nodejs代理服务器三】nodejs注册windows服务
查看>>
Python爬虫利器六之PyQuery的用法
查看>>
sessiondataOracle alert 文件分析
查看>>
空格样例HDU1241:Oil Deposits
查看>>
按钮添加Android初学者的积累
查看>>
MAC如何开启ROOT账户
查看>>
D3(v5) in TypeScript 坐标轴之 scaleBand用法
查看>>
iOS中关于NavigationController中preferredStatusBarStyle一直不执行的问题
查看>>
Tutorial 4: Authentication & Permissions
查看>>
构建知识图谱,让自己更值钱
查看>>
java 相关软件使用趋势
查看>>
RednaxelaFX:软件工程师、主攻高级编程语言虚拟机的设计与实现
查看>>
C 笔记
查看>>
编译openjdk源码
查看>>
MYSQL 学习笔记1 -----mysqladmin -uroot -p status|extended-status
查看>>