Java多个线程之间处理共享数据的方式

题目要求:

有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();
	}
}

总结:要同步互斥的代码任务最好将他们分别放在独立的方法中,这些方法再放在同一个类中,这样比较容易实现操作的同步和通信

时间: 2024-10-19 16:14:32

Java多个线程之间处理共享数据的方式的相关文章

【java并发】线程范围内共享数据

假设现在有个公共的变量data,有不同的线程都可以去操作它,如果在不同的线程对data操作完成后再去取这个data,那么肯定会出现线程间的数据混乱问题,因为A线程在取data数据前可能B线程又对其进行了修改,下面写个程序来说明一下该问题: public class ThreadScopeShareData { private static int data = 0;//公共的数据 public static void main(String[] args) { for(int i = 0; i

java多线程学习-多个线程访问对象共享数据的方式

public class MulitThreadShareData { public static void main(String[] args) { final ShareData1 data1 = new ShareData1(); new Thread(new Runnable() { public void run() { data1.increment(); } }).start(); new Thread(new Runnable() { public void run() { d

7.多个线程之间共享数据的方式探讨-JDK5多线程

1 /** 2 * 多个线程之间共享数据的方式探讨 3 * @author LiTaiQing 4 * 5 * ************************************************* 6 * 如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,有 7 * 如下两种方式来实现这些Runnble对象之间的数据共享: 8 * 1.将共享数据封装在另外一个对象中,然后将这个对象逐一传递给 9 * 各个Runnble对象.每个线程对共享数据的操作方法也分配到那个

多线程06-多线程共享数据的方式(经验小结)

1.案例分析-01 通过代码实现火车票出售的例子 在实现代码之前先对问题进行分析:火车票出售应该是在多个窗口进行的(即多个线程),以一个车的班次来说,该班次的火车票张数即为多个窗口共享的数据 即这份共享数据为出售特定班次的火车票,这个动作在多个窗口都是不变的,变更的只有火车票的剩余张数.代码实现如下: package org.lkl.thead; /** * * Function : 多线程共享数据 * * @author : Liaokailin CreateDate : 2014-6-13

多个Activity之间共享数据的方式

现在要做一个项目,多个Activity之间要共享数据,所以要考虑共享数据的方式. 其实有如下5种方式: 1.基于消息的通信机制  Intent ---bundle ,extra 数据类型有限,比如遇到不可序列化的数据Bitmap,InputStream, 或者LinkList链表等等数据类型就不太好用. 2. 利用static静态数据,public static成员变量: 3.基于外部存储的传输,  File/Preference/ Sqlite ,如果要针对第三方应用需要Content Pro

Java如何实现线程之间的互斥

给出一个题目,有3个线程,我希望线程1向控制台输出3行信息后,线程2向控制台输出6行信息,接下来是线程3输出10行信息到控制台,如此循环10次.在一个线程输出信息的时候,其他线程不能产生干扰. package com.concurrent.condition; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.

多个线程访问共享对象和数据的方式

多个线程访问共享对象和数据的方式有两种情况:1.每个线程执行的代码相同,例如,卖票:多个窗口同时卖这100张票,这100张票需要多个线程共享.2.每个线程执行的代码不同,例如:设计四个线程,其中两个线程每次对j增加1,另外两个线程每次对j减少1. a.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个对象中有共享数据.卖票就可以这样做,每个窗口都在做卖票任务,卖的票都是同一个数据(点击查看具体案例). b.如果每个线程执行的代码不同,就需要使用不同的Runnable对象,有两种

Java线程与并发库高级应用-线程范围内共享数据ThreadLocal类

1.线程范围内共享变量 1.1 前奏: 使用一个Map来实现线程范围内共享变量 public class ThreadScopeShareData { static Map<Thread, Integer> dataMap = new HashMap<Thread, Integer>(); public static void main(String[] args) { for (int i = 0; i < 2; i++) { new Thread(new Runnable

如何实现线程范围内共享数据 -- ThreadLocall类及其应用技巧

目标:如何保证各自线程上的数据是独立的,即A线程上数据只能被A线程操作 1:示例线程共享变量 我们先来看一个反例 package com.prepare.study; import java.util.Random; /** * @author: yinlm * @Date: Created in 2018/4/18 * @Description:多个线程数据混乱的示例 */ public class ThreadTest2 { // static 修饰 表示这是个全局变量 private st