Java线程——线程之间的数据共享
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线程——线程之间的数据共享的更多相关文章
- 并发编程8 线程的创建&验证线程之间数据共享&守护线程&线程进程效率对比&锁(死锁/递归锁)
1.线程理论以及线程的两种创建方法 2.线程之间是数据共享的与join方法 3.多线程和多进程的效率对比 4.数据共享的补充线程开启太快 5.线程锁 互斥锁 同步锁 6.死锁现象和递归锁 7.守护线程 ...
- java 多线程 day05 线程范围内的数据共享
import java.util.HashMap;import java.util.Map;import java.util.Random;/** * Created by chengtao on 1 ...
- Java多线程——线程之间的协作
Java多线程——线程之间的协作 摘要:本文主要学习多线程之间是如何协作的,以及如何使用wait()方法与notify()/notifyAll()方法. 部分内容来自以下博客: https://www ...
- Java多线程——线程之间的同步
Java多线程——线程之间的同步 摘要:本文主要学习多线程之间是如何同步的,如何使用volatile关键字,如何使用synchronized修饰的同步代码块和同步方法解决线程安全问题. 部分内容来自以 ...
- Java多线程——线程范围内共享变量
多个线程访问共享对象和数据的方式 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. package java_ ...
- java中线程队列BlockingQueue的用法
在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利.本文 ...
- Java并发——线程安全、线程同步、线程通信
线程安全 进程间"共享"对象 多个“写”线程同时访问对象. 例:Timer实例的num成员,即add()方法是用的次数.即Timer实例是资源对象. class TestSync ...
- Java多线程——线程范围内共享变量和ThreadLocal
多个线程访问共享对象和数据的方式 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. package java_ ...
- java之线程
java之线程 一:线程: 线程是什么呢?线程,有时被称为轻量级进程是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成.另外,线程是进程中的一个实体,是被系统 ...
随机推荐
- NoSql相关
1 NoSQL, No Problem: An Intro to NoSQL Databases https://www.thoughtworks.com/insights/blog/nosql-n ...
- TFIDF介绍
简介 全称: Term Frequency-inverse document frequency(文本频率与逆文档频率指数) 目的: 表征一个token(可以是一个字或者一个词)的重要程度 是Elas ...
- supervisor的介绍
1.supervisor 简介 Supervisor 是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统.它可以很方便的 ...
- SSM 整合配置以及一个简单登陆案例(个人记录)
SSM 文件以及大部分参考博客 https://blog.csdn.net/qq598535550/article/details/51703190 简答的登陆注册案例下载链接在末尾补贴图了 我建立的 ...
- P 1038 统计同成绩学生
转跳点:
- HDU - 1698 Just a Hook (线段树---区间修改)
题意:n个棍子,初始值全为1,给定Q个区间,分别赋值,问n个棍子的总值. 分析:lazy标记主要体现在update上. 当l <= L && R <= r时,该结点的子结点 ...
- linux下安装redis,按照redis官网安装不成功需要提前安装c++环境(安装成功并可以测试)
这个安装是一种便捷的安装,没有几句,但是完全按照官网上的来没有安装成功,有前提条件的 打开linux root登录 然后在usr下面建文件夹redis,进入 在该文件加下,直接按照官网的指导进行安装即 ...
- ExcelPackage导入导出,命名空间一定要是EPPlus
1.引入EPPlus.dll,旧版的是OfficeOpenXml.dll,最好使用EPPlus2.调用 string path = UploadExecl(batchUpload.BinaryExce ...
- 117-PHP在外部无法调用private类成员函数
<?php class ren{ //定义人类 public function walk(){ //定义public成员方法 echo '我会走路.'; } private function d ...
- 留学论文Results部分英文写作句型整理
本文分享曼切斯特大学全校语言项目负责人约翰·莫莱博士(Dr John Morley)给出的与结果介绍相关的句型,小编为大家整理了一下一共分为了11类,看完之后觉得非常有用,这里分享给大家,各位留学小伙 ...