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),寄存器集合和堆栈组成.另外,线程是进程中的一个实体,是被系统 ...
随机推荐
- Numpy中np.random.randn与np.random.rand的区别,及np.mgrid与np.ogrid的理解
np.random.randn是基于标准正态分布产生的随机数,np.random.rand是基于均匀分布产生的随机数,其值在[0,1). np.mgrid 与np.ogrid的理解及区别:np.mgr ...
- python假设一段楼梯共 n(n>1)个台阶,小朋友一步最多能上 3 个台阶,那么小朋友上这段楼 梯一共有多少种方法
我们先把前四节种数算出来(自己想是哪几类,如果你不会算,那就放弃写代码吧,干一些在街上卖肉夹馍的小生意,也挣得不少) 标号 1 2 3 4 种类 1 2 4 7 ...
- (最详细)JAVA如何连接虚拟机的HBASE和hadoop(JAVA如何远程访问虚拟机HBASE)
第一步: 首先把虚拟机和你的主机(本地电脑)弄通这样本地机器才能访问虚拟机里面的内容 我用的虚拟机为 VMware Workstation linux 为 centeros 补充一点虚拟机设置 1 ...
- java代码静态分析工具
需求:有些基础类型的遍历,值希望它被赋予指定的几个值,赋予其他值能够别编译器(IDEA/eclipse)提醒 Android studu结合自己的插件,引入 <!-- https://mvnre ...
- 从零到Django大牛的的进阶之路01
搭建 创建虚拟环境 mkvirtualenv django_py3_1.11 -p python3 安装Django pip install django==1.11.11 创建工程 django-a ...
- POJ 2823:Sliding Window 单调队列
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 48930 Accepted: 14130 ...
- Live555研究之一 源代码编译
Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SIP等的支持.Live555实现了对多种音视频编码格式的音视频数据的流化 ...
- servlet中urlpatterns注意事项
在servlet中, @WebServlet(urlPatterns="/newsAdd")接收 resp.sendRedirect("/wedding/houtai/N ...
- StackExchange.Redis.DLL 操作redis加强版
直接引用StackExchange.Redis.dll这一个dll来操作redis App.config配置 <?xml version="1.0" encoding=&qu ...
- SPOJ_DSUBSEQ Distinct Subsequences
统计一个只由大写字母构成的字符串的,子串数目,这里指的是子串不是子序列,可以不连续,请注意 然后我按照计数DP的思想,dp[i][j]表示长度为i的子串,最后一个字母为j 然后为了去重,每一次dp的时 ...