在 Java 传统线程机制中的共享数据方式,大致可以简单分两种情况:
➢ 多个线程行为一致,共同操作一个数据源。也就是每个线程执行的代码相同,可以使用同一个 Runnable 对象,这个 Runnable 对象中有那个共享数据,例如,卖票系统就可以这么做。
➢ 多个线程行为不一致,共同操作一个数据源。也就是每个线程执行的代码不同,这时候需要用不同的Runnable 对象。例如,银行存取款。 
 
实例1:多个线程行为一致共同操作一个数据
 
  如果每个线程执行的代码相同,可以使用同一个 Runnable 对象,这个 Runnable 对象中有那个共享数据,例如,买票系统就可以这么做。

package com.itheima.gan;
//买票系统
//共享数据类
class ShareDate{
private int num=10; //10张票 public synchronized void inc() {
num++;
System.out.println(Thread.currentThread().getName()+
": invoke inc method num="+num);
try {
//线程休眠1s
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} /**
* 多线程类
* @author 12428
*
*/
public class RunnableCusToInc implements Runnable{ private ShareDate shareDate;
//构造方法,将数据传递进去
public RunnableCusToInc(ShareDate shareDate) {
this.shareDate=shareDate;
}
//线程应该做的事
@Override
public void run() {
for(int i=0;i<5;i++) {
shareDate.inc();
} } public static void main(String[] args) {
ShareDate shareDate=new ShareDate(); for(int i=0;i<4;i++) {
new Thread(new RunnableCusToInc(shareDate),"线程"+i).start();
}
}
}

实例2:多个线程行为不一致共同操作一个数据 

如果每个线程执行的代码不同,这时候需要用不同的 Runnable 对象,有如下两种方式来实现这些 Runnable 对象之间的数据共享

(1)将共享的数据放到一个对象中,在把这个对象逐一传递给各个Runnable对象,每个线程对该数据的操作也放在这个对象的不同方法中,这样说实现容易针对对该数据进行的各个操作的互斥和通信。

package com.itheima.gan;

class RunnableCusToDec implements Runnable {
private ShareDate1 shareDate; public RunnableCusToDec(ShareDate1 shareDate) {
this.shareDate = shareDate;
} @Override
public void run() {
for (int i = 0; i < 5; i++) {
shareDate.dec();
}
}
} public class RunnableCusToInc2 implements Runnable { private ShareDate1 shareDate; public RunnableCusToInc2(ShareDate1 shareDate) {
this.shareDate = shareDate;
} @Override
public void run() {
for (int i = 0; i < 5; i++) {
shareDate.inc();
}
} public static void main(String[] args) {
ShareDate1 shareDate1=new ShareDate1();
for(int i=0;i<4;i++) {
if(i%2==0) {
new Thread(new RunnableCusToInc2(shareDate1),"Thread"+i).start();
}else {
new Thread(new RunnableCusToDec(shareDate1),"Thread"+i).start();
}
}
}
} /*
* 共享数据类
*/
class ShareDate1 {
private int num = 10; public synchronized void inc() {
num++;
System.out.println(Thread.currentThread().getName() + ": invoke inc method num=" + num); try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} public synchronized void dec() {
num--;
System.err.println(Thread.currentThread().getName() + ": invoke dec method num =" + num);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

  运行结果如图:

(2)将这些 Runnable 对象作为某一个类中的内部类,共享数据作为这个外部类中的成员变量,每个线程对共享数据的操作方法也分配给外部类,以便实现对共享数据进行的各个操作的互斥和通信,作为内部类的各个Runnable 对象调用外部类的这些方法。

package com.itheima.gan;

public class RunnableTest {
public static void main(String[] args) {
//公共数据
final ShareDate2 shareDate=new ShareDate2();
for(int i=0;i<4;i++) {
if(i%2==0) {
new Thread(new Runnable() { @Override
public void run() {
for(int i=0;i<5;i++) {
shareDate.inc();
} }
},"Thread "+i).start();
}else {
new Thread(new Runnable() { @Override
public void run() {
for(int i=0;i<5;i++) {
shareDate.dec();
} }
}).start();
}
}
}
} //公共数据类
class ShareDate2{ private int num=10; public synchronized void inc() {
num++;
System.err.println(Thread.currentThread().getName()+" : invoke inc method num = "+num);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} public synchronized void dec() {
num--;
System.out.println(Thread.currentThread().getName()+" : invoke dec method num = "+num);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} }

  运行结果如图:

Java线程——线程之间的数据共享的更多相关文章

  1. 并发编程8 线程的创建&验证线程之间数据共享&守护线程&线程进程效率对比&锁(死锁/递归锁)

    1.线程理论以及线程的两种创建方法 2.线程之间是数据共享的与join方法 3.多线程和多进程的效率对比 4.数据共享的补充线程开启太快 5.线程锁 互斥锁 同步锁 6.死锁现象和递归锁 7.守护线程 ...

  2. java 多线程 day05 线程范围内的数据共享

    import java.util.HashMap;import java.util.Map;import java.util.Random;/** * Created by chengtao on 1 ...

  3. Java多线程——线程之间的协作

    Java多线程——线程之间的协作 摘要:本文主要学习多线程之间是如何协作的,以及如何使用wait()方法与notify()/notifyAll()方法. 部分内容来自以下博客: https://www ...

  4. Java多线程——线程之间的同步

    Java多线程——线程之间的同步 摘要:本文主要学习多线程之间是如何同步的,如何使用volatile关键字,如何使用synchronized修饰的同步代码块和同步方法解决线程安全问题. 部分内容来自以 ...

  5. Java多线程——线程范围内共享变量

    多个线程访问共享对象和数据的方式 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. package java_ ...

  6. java中线程队列BlockingQueue的用法

    在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利.本文 ...

  7. Java并发——线程安全、线程同步、线程通信

    线程安全 进程间"共享"对象 多个“写”线程同时访问对象. 例:Timer实例的num成员,即add()方法是用的次数.即Timer实例是资源对象. class TestSync ...

  8. Java多线程——线程范围内共享变量和ThreadLocal

    多个线程访问共享对象和数据的方式 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. package java_ ...

  9. java之线程

    java之线程 一:线程: 线程是什么呢?线程,有时被称为轻量级进程是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成.另外,线程是进程中的一个实体,是被系统 ...

随机推荐

  1. SSM 整合配置以及一个简单登陆案例(个人记录)

    SSM 文件以及大部分参考博客 https://blog.csdn.net/qq598535550/article/details/51703190 简答的登陆注册案例下载链接在末尾补贴图了 我建立的 ...

  2. 《ES6标准入门》(阮一峰)--9.数组的扩展

    1.扩展运算符 含义 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. console.log(...[1, 2, 3]) // 1 ...

  3. (分治)输出前m大的数。。。

    描述给定一个数组包含n个元素,统计前m大的数并且把这m个数从大到小输出.输入第一行包含一个整数n,表示数组的大小.n < 100000.第二行包含n个整数,表示数组的元素,整数之间以一个空格分开 ...

  4. HDU - 6205 card card card (尺取法)

    题意:有n堆牌,ai表示每堆牌的牌数,bi表示每堆牌的penaltyvalue,操作开始前,可以重复进行将第一堆牌挪到最后一堆这一操作.然后,对于挪完后的牌,从第一堆开始,依次取.对于每一堆牌,首先将 ...

  5. VMware CentOS网络配置

  6. nginx location语法解释

    1.没有修饰符 表示:必须以指定模式开始,如:              默认模式 server { server_name baidu.com; location /abc { …… } } htt ...

  7. x86平台inline hook原理和实现

    概念 inline hook是一种通过修改机器码的方式来实现hook的技术. 原理 对于正常执行的程序,它的函数调用流程大概是这样的: 0x1000地址的call指令执行后跳转到0x3000地址处执行 ...

  8. css怎么让图片垂直左右居中?(外层div是浮动且按照百分比排列)

    一.原始的居中方法是把div换成table <div style="width: 500px; height: 200px; border: solid 1px red; text-a ...

  9. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-barcode

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  10. python EasyUI + Django--整合 CSRF 防护去除

    先来张完整图: 关于Django 得CSRF  中间件      防护   GET 是不做CSRF验证得   但POST 默认验证  $.cookie('csrftoken'))    "v ...