如果每个线程执行相同的代码,比如售票案例,则可以使用一个Runnable对象,这个Runnable对象中有那个共享数据。
package Thread02;
public class MultiThreadShareData {
static ShareData1 data1=new ShareData1();
public static void main(String[] args) {
new Thread(data1){
}.start();
new Thread(data1){
}.start();
}
}
//如果每个线程执行相同的代码,可以使用同过一个runnable对象,
//这个runnable对象中有那个共享数据,例如售票案例。
class ShareData1 implements Runnable{
private int count=100;
public void run() {
while(count>0)
{
System.out.println(Thread.currentThread().getName()+"销售第"+count+"票!");
count--;
}
}
}
如果每个线程执行代码不同,这时候需要使用不同的Runnable对象,有如下两种方式来实现这些Runnable对象间的数据共享。
1、将共享数据封装在另外一个对象中,然后将这个对象逐一传递给每个Runnable对象,每个线程对共享数据的操作方法也分配到那个对象身上去完成,这样容易实现针对该数据进行的各个操作的互斥和通信
2、将这些Runnable对象作为某一个类中的内部类,共享数据作为这个外部类中的成员变量,每个线程对共享数据的操作方法也分配给外部类,以便实现对共享数据进行的各个操作的互斥和通信,作为内部类的各个Runnable对象调用外部类的这些方法。
package Thread02;
public class MultiThreadShareData {
public static void main(String[] args) {
final ShareData1 data1=new ShareData1();//把共享数据封装待data1里面
new Thread(new MyRunnable1(data1)).start();//然后把这个对象传递给每个Runnable对象
new Thread(new MyRunnable2(data1)).start();
}
}
class MyRunnable1 implements Runnable{
private ShareData1 data1;
public MyRunnable1(ShareData1 data1){
this.data1=data1;
}
@Override
public void run() {
while(true){
data1.decrement();
}
}
}
class MyRunnable2 implements Runnable{
private ShareData1 data1;
public MyRunnable2(ShareData1 data1){
this.data1=data1;
}
@Override
public void run() {
while(true){
data1.increment();
}
}
}
class ShareData1{
private int j=0;
public synchronized void increment(){
j++;
System.out.println(Thread.currentThread().getName()+" : "+j);
}
public synchronized void decrement(){
j--;
System.out.println(Thread.currentThread().getName()+" : "+j);
}
}
package Thread02;
public class MultiThreadShareData {
static ShareData1 data1=new ShareData1();//把共享数据作为外部类的成员变量
public static void main(String[] args) {
new Thread(new Runnable() {//把两个Runnable作为内部类
@Override
public void run() {
while(true){
data1.decrement();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while(true){
data1.increment();
}
}
}).start();
}
}
class ShareData1{
private int j=0;
public synchronized void increment(){
j++;
System.out.println(Thread.currentThread().getName()+" : "+j);
}
public synchronized void decrement(){
j--;
System.out.println(Thread.currentThread().getName()+" : "+j);
}
}