多线程共享数据的方式:

1。假设每一个线程运行的代码同样。能够使用同一个Runnable对象,这个Runnable对象中有那个共享数据,比如,卖票系统就能够这么做。

2,假设每一个线程运行的代码不同。这时候须要用不同的Runnable对象,比如,设计4个线程。

当中两个线程每次对j添加1。另外两个线程对j每次减1。银行存取款

有两种方法来解决此类问题:

将共享数据封装成另外一个对象,然后将这个对象逐一传递给各个Runnable对象。每一个线程对共享数据的操作方法也分配到那个对象身上完毕,这样easy实现针对数据进行各个操作的相互排斥和通信

将Runnable对象作为一个类的内部类,共享数据作为这个类的成员变量,每一个线程对共享数据的操作方法也封装在外部类,以便实现对数据的各个操作的同步和相互排斥。作为内部类的各个Runnable对象调用外部类的这些方法。

以下逐一介绍

每一个线程运行的代码同样,能够使用同一个Runnable对象

卖票系统demo:

package com.tgb.hjy;
/**
* 多线程共享数据-卖票系统
* @author hejingyuan
*
*/
public class SellTicket { /**
* @param args
*/
public static void main(String[] args) {
Ticket t = new Ticket();
new Thread(t).start();
new Thread(t).start();
}
}
class Ticket implements Runnable{ private int ticket = 10;
public void run() {
while(ticket>0){
ticket--;
System.out.println("当前票数为:"+ticket);
} } }


简单的多线程间数据共享,每一个线程运行的代码不同。用不同的Runnable对象

设计4个线程。

当中两个线程每次对j添加1,另外两个线程对j每次减1

package com.tgb.hjy;

public class TestThread {

	 /**
* @param args
*/
public static void main(String[] args) {
final MyData data = new MyData();
for(int i=0;i<2;i++){
new Thread(new Runnable(){ public void run() {
data.add(); } }).start();
new Thread(new Runnable(){ public void run() {
data.dec(); } }).start();
}
} } class MyData {
private int j=0;
public synchronized void add(){
j++;
System.out.println("线程"+Thread.currentThread().getName()+"j为:"+j);
}
public synchronized void dec(){
j--;
System.out.println("线程"+Thread.currentThread().getName()+"j为:"+j);
} }


银行存取款实例:

package com.tgb.hjy;

public class Acount {

	 private int money;
public Acount(int money){
this.money=money;
} public synchronized void getMoney(int money){
//注意这个地方必须用while循环。由于即便再存入钱也有可能比取的要少
while(this.money<money){
System.out.println("取款:"+money+" 剩余金额:"+this.money+" 剩余金额不足,正在等待存款......");
try{ wait();} catch(Exception e){}
}
this.money=this.money-money;
System.out.println("取出:"+money+" 还剩余:"+this.money); } public synchronized void setMoney(int money){ try{ Thread.sleep(10);}catch(Exception e){}
this.money=this.money+money;
System.out.println("新存入:"+money+" 共计:"+this.money);
notify();
} public static void main(String args[]){
Acount Acount=new Acount(0);
Bank b=new Bank(Acount);
Consumer c=new Consumer(Acount);
new Thread(b).start();
new Thread(c).start();
}
}
//存款类
class Bank implements Runnable {
Acount Acount;
public Bank(Acount Acount){
this.Acount=Acount;
}
public void run(){
while(true){
int temp=(int)(Math.random()*1000);
Acount.setMoney(temp);
}
} }
//取款类
class Consumer implements Runnable {
Acount Acount;
public Consumer(Acount Acount){
this.Acount=Acount;
}
public void run(){
while(true){
int temp=(int)(Math.random()*1000);
Acount.getMoney(temp);
}
}
}


总结:

事实上多线程间的共享数据最基本的还是相互排斥,多个线程共享一个变量,针对变量的操作实现原子性就可以。

JAVA 并发编程-多个线程之间共享数据(六)的更多相关文章

  1. JAVA 并发编程-多个线程之间共享数据

    原文地址:http://blog.csdn.net/hejingyuan6/article/details/47053409# 多线程共享数据的方式: 1,如果每个线程执行的代码相同,可以使用同一个R ...

  2. 【转】JAVA 并发编程-多个线程之间共享数据

    原文地址:http://blog.csdn.net/hejingyuan6/article/details/47053409# 多线程共享数据的方式: 1,如果每个线程执行的代码相同,可以使用同一个R ...

  3. Java并发编程--6.Exchanger线程间交换数据

    在两个线程之间定义同步点,当两个线程都到达同步点时,他们交换数据结构,因此第一个线程的数据结构进入到第二个线程中,第二个线程的数据结构进入到第一个线程中 在生产者-消费者情境模式中它包含了一个数缓冲区 ...

  4. Java并发编程系列-(2) 线程的并发工具类

    2.线程的并发工具类 2.1 Fork-Join JDK 7中引入了fork-join框架,专门来解决计算密集型的任务.可以将一个大任务,拆分成若干个小任务,如下图所示: Fork-Join框架利用了 ...

  5. 【Java并发编程一】线程安全和共享对象

    一.什么是线程安全 当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替执行,并且不需要额外的同步及在调用代码代码不必作其他的协调,这个类的行为仍然是正确的,那么称这个类是线程安全的 ...

  6. Java并发编程实战 之 对象的共享

    上一篇介绍了如何通过同步多个线程避免同一时刻访问相同数据,本篇介绍如何共享和发布对象,使它们被安全地由多个进程访问. 1.可见性 通常,我们无法保证执行读操作的线程能看到其他线程写入的值,因为每个线程 ...

  7. 【java并发编程实战】-----线程基本概念

    学习Java并发已经有一个多月了,感觉有些东西学习一会儿了就会忘记,做了一些笔记但是不系统,对于Java并发这么大的"系统",需要自己好好总结.整理才能征服它.希望同仁们一起来学习 ...

  8. Java并发编程扩展(线程通信、线程池)

    之前我说过,实现多线程的方式有4种,但是之前的文章中,我只介绍了两种,那么下面这两种,可以了解了解,不懂没关系. 之前的文章-->Java并发编程之多线程 使用ExecutorService.C ...

  9. Java并发编程:进程和线程的由来(转)

    Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通 ...

随机推荐

  1. 使用hasOwnProperty监测对象是否含有某个属性

    1.示例代码 <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UT ...

  2. SuperMap iObjects for Spark使用

    本文档环境基于ubuntu16.04版本,(转发请注明出处:http://www.cnblogs.com/zhangyongli2011/ 如发现有错,请留言,谢谢) 1. 基础环境搭建 基础环境搭建 ...

  3. Android开发之Google Map

    2013-07-03 Google Map 提供三种视图: 1. 传统的矢量地图,提供行政区域.交通以及商业信息等. 2. 不同分辨率的卫星照片,与Google Earth 基本一样. 3. 地形地图 ...

  4. 安装 Percona XtraBackup 2.3

    Installing Percona XtraBackup from Percona yum repository Install the Percona repository You can ins ...

  5. JavaScript 中的所有数据都是以 64 位浮点型数据(float) 来存储。浮点型数据使用注意事项。全局变量特殊之处

    JavaScript 中的所有数据都是以 64 位浮点型数据(float) 来存储. 所有的编程语言,包括 JavaScript,对浮点型数据的精确度都很难确定: <!DOCTYPE html& ...

  6. EMQ ---问题集

    1)emqttd 使用 SSL遇到的问题:服务器直接布了一份emqttd ,然后什么都没管,端口默认的ws 8083,wss8084,mqtt 1883,mqtt(ssl) 8883. 结果跑起来之后 ...

  7. Python -- 标准库 文件管理 (部分os包,shutil包)

    在操作系统下,用户可以通过操作系统的命令来管理文件,参考linux文件管理相关命令.Python标准库则允许我们从Python内部管理文件.相同的目的,我们有了两条途径.尽管在Python调用标准库的 ...

  8. Oracle开发者守则

    下面为Oracle大师级语录: Oracle Database developers should follow is to do everything they can in SQL. What t ...

  9. unity, editorWindow update计时

    对于editorWindow,Time.deltaTime不起作用,所以需用下面方法对update进行计时: public class myEditorWindow : EditorWindow{ p ...

  10. redis五种基本数据类型

    1.string类:一个key对应一个value(key:value).string类是二进制安全,可以包含任何数据(例如:图片.音乐). 2.hash类:string类型field和value的映射 ...