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),寄存器集合和堆栈组成.另外,线程是进程中的一个实体,是被系统 ...
随机推荐
- 【LOJ6498】「雅礼集训 2018 Day2」农民
题面 solution 直接暴力模拟,原数据可获得满分的成绩. 对于每个点,其父亲对其都有一个限制.故我们只需要判断当前点到根的路径上的限制是否都能满足即可. 考虑用树剖+线段树维护这个限制.考虑到翻 ...
- [强网杯 2019]Upload
0x00 知识点 代码审计,PHP 反序列化. 0x01 解题 先注册一个账号,再登陆 上传 简单测试一下: 只能上传能被正常查看的 png. F12看到文件上传路径 扫扫敏感文件 存在:/www.t ...
- Golang函数-不定参函数
Golang函数-不定参函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- 网卡工作原理和wireshark混杂模式
通过设置网卡为混杂模式就能捕获局域网内所有发包内容,包括非广播包和非发给自己主机的数据包 这是为什么呢? 即主机A发送一个数据包给主机B,我作为主机C怎么也能截获这个数据包呢,原理是什么? 我的网卡为 ...
- 关于spring-mvc.xml的静态资源的配置
转 配置如下: <!-- 配置静态资源 --><mvc:resources location="/static/" mapping="/static/* ...
- 小程序地图开发周边信息POI展示为列表
##首先附上效果图 在我前面的文章中我详述过如何使用百度地图API来开发小程序的地图,所以这里面就不说基础内容了. 直说如下: ##1.如何获取列表: //分类存储 makertap: functio ...
- 《ES6标准入门》(阮一峰)--2.let 和 const 命令
1.let命令 基本用法 let只在命令所在的代码块内(花括号内)有效. for循环的计数器,就很合适使用let命令. //var var a = []; for (var i = 0; i < ...
- CodeForces - 706C Hard problem(dp+字符串)
题意:有n个字符串,只能将其逆转,不能交换位置,且已知逆转某字符串需要消耗的能量,问将这n个字符串按字典序从小到大排序所需消耗的最少能量. 分析:每个字符串要么逆转,要么不逆转,相邻两个字符串进行比较 ...
- POJ 3663:Costume Party
Costume Party Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12607 Accepted: 4977 De ...
- TX2-刷机完成后安装程序ubuntu_linux命令&TX2学习总结
Linux教程|菜鸟教程:http://www.runoob.com/linux/linux-tutorial.html 认识linux:ping命令:ping命令是常用的网络命令ping网关:pin ...