多线程范围内的数据共享
2015-12-13 12:43
288 查看
多线程范围内的共享解决方法参考有4中:
1.如果线程执行的代码相同,多个线程共享同一个runnable对象时,将共享数据放在runnable对象
2.如果多个线程执行的代码不同,将共享数据封装到一个对象中,将这个对象逐一传递给各个runnable对象
3.如果多个线程执行的代码不同,将共享数据作为外部类的final成员变量,将不同的runnable对象作为内部类主动取数据
4.将数据声明为static的方式()
见如下示例:
1.如果线程执行的代码相同,多个线程共享同一个runnable对象时,将共享数据放在runnable对象
运行结果:最终还是100,不同的线程使用共享数据
2.如果多个线程执行的代码不同,将共享数据封装到一个对象中,将这个对象逐一传递给各个runnable对象
运行结果:
3.如果多个线程执行的代码不同,将共享数据作为外部类的final成员变量,将不同的runnable对象作为内部类主动取数据
4.将数据声明为static的方式
完
1.如果线程执行的代码相同,多个线程共享同一个runnable对象时,将共享数据放在runnable对象
2.如果多个线程执行的代码不同,将共享数据封装到一个对象中,将这个对象逐一传递给各个runnable对象
3.如果多个线程执行的代码不同,将共享数据作为外部类的final成员变量,将不同的runnable对象作为内部类主动取数据
4.将数据声明为static的方式()
见如下示例:
1.如果线程执行的代码相同,多个线程共享同一个runnable对象时,将共享数据放在runnable对象
public class MuiltThreadShare { /** * 多个线程共享数据方法: * 1.如果线程执行的代码相同,多个线程共享同一个runnable对象时,将共享数据放在runnable对象 * 2.如果多个线程执行的代码不同,将共享数据封装到一个对象中,将这个对象逐一传递给各个runnable对象 * 3.如果多个线程执行的代码不同,将共享数据作为外部类的final成员变量,将不同的runnable对象作为内部类主动取数据 */ public static void main(String[] args) { //1.方式一 Task1 task1 = new Task1(); new Thread(task1).start(); new Thread(task1).start(); new Thread(task1).start(); } } class Task1 implements Runnable{ /** * 1.如果线程执行的代码相同,多个线程共享同一个runnable对象时,将共享数据放在runnable对象 */ private int i = 100; @Override public void run() { increase(); decrease(); } private synchronized void increase(){ try { Thread.sleep(200);//为了更容易看到线程执行现象 } catch (InterruptedException e) { e.printStackTrace(); } i++; System.out.println(Thread.currentThread().getName() +",num:"+i); } private synchronized void decrease(){ i--; System.out.println(Thread.currentThread().getName() +",num:"+i); }
运行结果:最终还是100,不同的线程使用共享数据
运行结果 // Thread-0,num:101 // Thread-2,num:102 // Thread-1,num:103 // Thread-2,num:102 // Thread-0,num:101 // Thread-1,num:100
2.如果多个线程执行的代码不同,将共享数据封装到一个对象中,将这个对象逐一传递给各个runnable对象
public class MuiltThreadDataShare2 { public static void main(String[] args) { // 2.如果多个线程执行的代码不同,将共享数据封装到一个对象中,将这个对象逐一传递给各个runnable对象 /** * 模拟银行转账功能,可以指定存取款金额,账号初始额度100 */ ShareData data = new ShareData(0); // 存50元 new Thread(new TaskIncrease(data, 50)).start(); // 取30元 new Thread(new Taskdecrease(data, 30)).start(); // 存20 new Thread(new TaskIncrease(data, 20)).start(); } } class Taskdecrease implements Runnable { public Taskdecrease(ShareData shareData, int num) { this.shareData = shareData; this.num = num; } private int num; private ShareData shareData; @Override public void run() { shareData.decrease(num); } } class TaskIncrease implements Runnable { public TaskIncrease(ShareData shareData, int num) { this.shareData = shareData; this.num = num; } private ShareData shareData; private int num; @Override public void run() { shareData.increase(num); } } class ShareData { public ShareData(int num) { i = num; System.out.println("账户进行初始化,金额为:" + num); } private int i; public synchronized void increase(int i) { try { Thread.sleep(200);// 为了更容易看到线程执行现象 } catch (InterruptedException e) { e.printStackTrace(); } this.i = this.i + i; System.out.println(Thread.currentThread().getName() + "账户存入" + i + "元,目前账户余额为:" + this.i); } public synchronized void decrease(int i) { this.i = this.i - i; System.out.println(Thread.currentThread().getName() + "账户取出" + i + "元,目前账户余额为:" + this.i); } }
运行结果:
账户进行初始化,金额为:0 Thread-0账户存入50元,目前账户余额为:50 Thread-2账户存入20元,目前账户余额为:70 Thread-1账户取出30元,目前账户余额为:40
3.如果多个线程执行的代码不同,将共享数据作为外部类的final成员变量,将不同的runnable对象作为内部类主动取数据
public class MuiltThreadDataShare3 { public static void main(String[] args) { final Data data = new Data(); new Thread(new Runnable() { @Override public void run() { data.decrease(10); } }).start(); new Thread(new Runnable() { @Override public void run() { data.increase(30); } }).start(); } } class Data { private int money = 100; public int getMoney() { return money; } public void setMoney(int money) { this.money = money; } public synchronized void increase(int i) { try { Thread.sleep(200);// 为了更容易看到线程执行现象 } catch (InterruptedException e) { e.printStackTrace(); } this.money = this.money + i; System.out.println(Thread.currentThread().getName() + "账户存入" + i + "元,目前账户余额为:" + this.money); } public synchronized void decrease(int i) { this.money = this.money - i; System.out.println(Thread.currentThread().getName() + "账户取出" + i + "元,目前账户余额为:" + this.money); } }
4.将数据声明为static的方式
public class MuiltThreadDataShare4 { private static int num = 100; public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { increase(100); } }).start(); new Thread(new Runnable() { @Override public void run() { decrease(30); } }).start(); } public static synchronized void increase(int i) { try { Thread.sleep(200);// 为了更容易看到线程执行现象 } catch (InterruptedException e) { e.printStackTrace(); } num = num + i; System.out.println(Thread.currentThread().getName() + "账户存入" + i + "元,目前账户余额为:" + num); } public static synchronized void decrease(int i) { num = num - i; System.out.println(Thread.currentThread().getName() + "账户取出" + i + "元,目前账户余额为:" + num); } }
完
相关文章推荐
- PAT1012
- 怎样使用nat和桥接方式解决虚拟机联网问题
- 参数文件损坏或丢失
- SSH login to Aliyun ubuntu server without password
- cream 的qsqrt 及其原理
- 【.NET深呼吸】基础:自定义类型转换
- 使用FiddlerCore来测试WebAPI
- 简单的文本加密
- SQL * Loader详解
- mac+virtualbox+ubuntu 共享文件夹
- 服务器接受客户端图片
- 手把手入门神经网络系列(2)_74行代码实现手写数字识别
- Android开源项目:捕鱼达人游戏源代码
- linux Cent OS6.5 安装nodeJS(分分钟搞定)
- 如何安全退出已调用多个Activity的Application?
- unity C#模板
- hdu 2045 不容易系列之(3)—— LELE的RPG难题
- Hadoop伪分布集群安装
- HDU5595
- POJ 2262 筛素法