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;
}
}
总之要同步几段互斥的代码最好是放在不同的方法中,这些方法再放在同一个类中,这样比较容易实现他们之间的互斥和通信!
还没有评论,来说两句吧...