Java多个线程之间处理共享数据的方式
2015-06-25 09:38
645 查看
题目要求:
有4个线程,其中两个线程每次对x加1,另外两个每次对x减1,如何实现?
分析:
x就是这4个线程要处理的共享数据,不同种线程有不同的处理方式,但操作的数据是共同的,联想到“窗口买票问题”,但是卖票只是单纯的减。
所以,多个线程访问共享对象或数据的方式,先看,如果每个线程执行的代码相同,那么就可以使用同一个Runnable对象,这个对象中有被共享的数据,如买票问题。
如果每个线程执行的代码不同,肯定需要不用的Runnable对象,有两种方式实现这些不同的Runnable对象之间的数据共享:
第一种:将共享数据封装到一个对象中,把这个共享数据所在的对象传递给不同的Runnable,每个线程对共享数据的操作也分给那个
对象完成,这样就可以实现对该数据处理的互斥与通信。
class ShareData {
private int x = 0;
public synchronized void addx(){
x++;
System.out.println("x++ : "+x);
}
public synchronized void subx(){
x--;
System.out.println("x-- : "+x);
}
}
class MyRunnable1 implements Runnable{
private ShareData share1 = null;
public MyRunnable1(ShareData share1) {
this.share1 = share1;
}
public void run() {
for(int i = 0;i<100;i++){
share1.addx();
}
}
}
class MyRunnable2 implements Runnable{
private ShareData share2 = null;
public MyRunnable2(ShareData share2) {
this.share2 = share2;
}
public void run() {
for(int i = 0;i<100;i++){
share2.subx();
}
}
}
public class ThreadsVisitData {
public static void main(String[] args) {
ShareData share = new ShareData();
new Thread(new MyRunnable1(share)).start();
new Thread(new MyRunnable2(share)).start();
}
}
第二种:
将这些Runnable对象作为某一个类的内部类,共享的数据作为外部类的成员变量,对共享数据的操作分配给外部类的方法来完成,以此实现对操作共享数据的互斥和通信,作为内部类的Runnable来操作外部类的方法,实现对数据的操作
class ShareData {
private int x = 0;
public synchronized void addx(){
x++;
System.out.println("x++ : "+x);
}
public synchronized void subx(){
x--;
System.out.println("x-- : "+x);
}
}
public class ThreadsVisitData {
public static ShareData share = new ShareData();
public static void main(String[] args) {
//final ShareData share = new ShareData();
new Thread(new Runnable() {
public void run() {
for(int i = 0;i<100;i++){
share.addx();
}
}
}).start();
new Thread(new Runnable() {
public void run() {
for(int i = 0;i<100;i++){
share.subx();
}
}
}).start();
}
}
总结:要同步互斥的代码任务最好将他们分别放在独立的方法中,这些方法再放在同一个类中,这样比较容易实现操作的同步和通信。
Java多线程从简单到复杂 http://www.linuxidc.com/Linux/2014-07/104435.htm
Java多线程经典案例 http://www.linuxidc.com/Linux/2014-06/103458.htm
Java多线程:ReentrantReadWriteLock读写锁的使用 http://www.linuxidc.com/Linux/2014-06/103457.htm
Java内存映射文件实现多线程下载 http://www.linuxidc.com/Linux/2014-05/102201.htm
Java多线程:一道阿里面试题的分析与应对 http://www.linuxidc.com/Linux/2014-03/98715.htm
Java中两种实现多线程方式的对比分析 http://www.linuxidc.com/Linux/2013-12/93690.htm
本文永久更新链接地址:http://www.linuxidc.com/Linux/2014-12/110335.htm
有4个线程,其中两个线程每次对x加1,另外两个每次对x减1,如何实现?
分析:
x就是这4个线程要处理的共享数据,不同种线程有不同的处理方式,但操作的数据是共同的,联想到“窗口买票问题”,但是卖票只是单纯的减。
所以,多个线程访问共享对象或数据的方式,先看,如果每个线程执行的代码相同,那么就可以使用同一个Runnable对象,这个对象中有被共享的数据,如买票问题。
如果每个线程执行的代码不同,肯定需要不用的Runnable对象,有两种方式实现这些不同的Runnable对象之间的数据共享:
第一种:将共享数据封装到一个对象中,把这个共享数据所在的对象传递给不同的Runnable,每个线程对共享数据的操作也分给那个
对象完成,这样就可以实现对该数据处理的互斥与通信。
class ShareData {
private int x = 0;
public synchronized void addx(){
x++;
System.out.println("x++ : "+x);
}
public synchronized void subx(){
x--;
System.out.println("x-- : "+x);
}
}
class MyRunnable1 implements Runnable{
private ShareData share1 = null;
public MyRunnable1(ShareData share1) {
this.share1 = share1;
}
public void run() {
for(int i = 0;i<100;i++){
share1.addx();
}
}
}
class MyRunnable2 implements Runnable{
private ShareData share2 = null;
public MyRunnable2(ShareData share2) {
this.share2 = share2;
}
public void run() {
for(int i = 0;i<100;i++){
share2.subx();
}
}
}
public class ThreadsVisitData {
public static void main(String[] args) {
ShareData share = new ShareData();
new Thread(new MyRunnable1(share)).start();
new Thread(new MyRunnable2(share)).start();
}
}
第二种:
将这些Runnable对象作为某一个类的内部类,共享的数据作为外部类的成员变量,对共享数据的操作分配给外部类的方法来完成,以此实现对操作共享数据的互斥和通信,作为内部类的Runnable来操作外部类的方法,实现对数据的操作
class ShareData {
private int x = 0;
public synchronized void addx(){
x++;
System.out.println("x++ : "+x);
}
public synchronized void subx(){
x--;
System.out.println("x-- : "+x);
}
}
public class ThreadsVisitData {
public static ShareData share = new ShareData();
public static void main(String[] args) {
//final ShareData share = new ShareData();
new Thread(new Runnable() {
public void run() {
for(int i = 0;i<100;i++){
share.addx();
}
}
}).start();
new Thread(new Runnable() {
public void run() {
for(int i = 0;i<100;i++){
share.subx();
}
}
}).start();
}
}
总结:要同步互斥的代码任务最好将他们分别放在独立的方法中,这些方法再放在同一个类中,这样比较容易实现操作的同步和通信。
Java多线程从简单到复杂 http://www.linuxidc.com/Linux/2014-07/104435.htm
Java多线程经典案例 http://www.linuxidc.com/Linux/2014-06/103458.htm
Java多线程:ReentrantReadWriteLock读写锁的使用 http://www.linuxidc.com/Linux/2014-06/103457.htm
Java内存映射文件实现多线程下载 http://www.linuxidc.com/Linux/2014-05/102201.htm
Java多线程:一道阿里面试题的分析与应对 http://www.linuxidc.com/Linux/2014-03/98715.htm
Java中两种实现多线程方式的对比分析 http://www.linuxidc.com/Linux/2013-12/93690.htm
本文永久更新链接地址:http://www.linuxidc.com/Linux/2014-12/110335.htm
相关文章推荐
- ‘Failed to load the JNI shared library “C:\Program Files\Java\jdk1.8.0_31\bin\..解决方法
- Spring 注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性详解
- java经纬度距离换算,根据距离算经纬度差值
- JavaSE_集合_Collection接口简介
- 关于java中编译package包内源文件出错问题
- Java排序算法:快速排序
- Java排序算法:归并排序
- Java排序算法:堆排序
- java多线程编程
- 毕向东Java基础:day09_3-4
- 毕向东Java基础:day09_3-4
- Spring @Resource、@Autowired、@Qualifier的注解注入及区别
- 【面试】【Spring常见问题总结】【09】
- Ch2 一切皆对象——Thinking in JAVA读书笔记
- CH3 操作符——Thinking in Java 读书笔记
- 【面试】【Spring常见问题总结】【08】
- 【面试】【Spring常见问题总结】【07】
- 【java基础】——初识java中的设计模式
- maven3 junit4 spring3 jdk8 :junit一直报错,害的我几个星期都是这个错,你妹的!
- struts2中改变struts.xml默认路径