Thread学习(三)多个线程访问共享对象和数据的方式

1.如果每个线程执行的代码相同,可以使用同一个Runable对象,这个Runable对象中有那个共享数据,例如卖票系统就可以这样做。

2.如果每个线程执行的代码不相同,这个时候需要用到不同的Runable对象,有如下两种方式实现多个Runable对象中的数据共享。

(1)将共享数据封装在另一个对象中,然后将这对象逐一传递给各个Runable对象,每个线程对共享数据的操作方法也交给那个对象去进行,这样就能实现多个线程之间的互斥和通信。

public class SomeThreadTest2 {

	public static void main(String[] args) {
		A a = new A();
		new Thread(new C(a)).start();//创建第一个线程
		new Thread(new D(a)).start();//创建第二个线程
	}
	
}

class C implements Runnable{ //创建第一个Runable对象
	private A a;
	public C(A a) {
		this.a=a;
	}
	@Override
	public void run() {
		System.out.println(a.Add());;
	}
	
}

class D implements Runnable{ //创建第二个Runable对象
	private A a;
	public D(A a) {
		this.a=a;
	}
	@Override
	public void run() {
		System.out.println(a.Reduce());;
		
	}
	
}
/**
 * C和D执行的代码不相同,这个时候需要用到不同的Runable对象
 * 
 * A
 * 创建人:LiBoMing
 * 时间:2016年11月16日-上午10:20:08 
 * @version 1.0.0
 *
 */
class A {//存储共享数据的对象
	private Integer integer = 50;
	public synchronized Integer Reduce() { //操作共享数据的方法
		return --integer;
	}

	public synchronized Integer Add() { //操作共享数据的方法
		return ++integer;
	}
}


上面这个例子中A类中的integer是两个线程想要操作的共享数据,而两个线程要对共享数据执行的操作方法还是不同的,此时就需要两个Runable对象,这样就实现了Integer这个共享数据在多个线程中互斥和通信!!

(2)讲这些个Runable对象作为某一个类中的内部类,共享数据作为这个外部类中的成员变量,每个线程对共享数据的操作也作为这个外部类的方法,这些歌Runable对象分别取调用这个外部类的不同操作共享数据的方法,样就实现了这个共享数据在多个线程中互斥和通信!!

package com.lbm.Test;


public class SomeThreadTest {

	public static void main(String[] args) {
		A count = new A();
		/**
		 * 创建两个线程内部类,并且两个Runable对共享数据所做的操作不同
		 */
		new Thread(new Runnable() {//创建一个线程内部类
			@Override
			public void run() {
				System.out.println(count.Reduce());
			}
		}).start();
		new Thread(new Runnable() {//创建第二个线程内部类
			@Override
			public void run() {
				System.out.println(count.Add());
			}
		}).start();
	}
}

class A {
	private Integer integer = 50;//共享数据
	public synchronized Integer Reduce() {//对共享数据的操作方法(此处的synchronize是为了保证线程安全)
		return --integer;
	}

	public synchronized Integer Add() {//对共享数据的操作方法
		return ++integer;
	}
}


总之要同步几段互斥的代码最好是放在不同的方法中,这些方法再放在同一个类中,这样比较容易实现他们之间的互斥和通信!



你可能感兴趣的:(java多线程,java)