要实现多线程访问共享对象,一般要将有互斥的代码放在一个类当中。如果多线程中的每个线程执行的代码相同,可以功用一个Runable对象;如果不多线程代码不一致,则需要用多个Runable对象或者多个Runable实现类。
1、多线程需要访问的代码一致
可用一个Runable实现类来实现,如下:
/**
* 多线程访问共享对象和数据的方式 方式一:共享的代码是一样的
*
* @author xiao
*
*/
public class MultiThreadShareData1 {
public static void main(String[] args) {
// 对象共享
ShareData1 data1 = new ShareData1();
new Thread(data1).start();
new Thread(data1).start();
}
}
class ShareData1 implements Runnable {
private int count = 100;
@Override
public void run() {
while (count > 0) {
count--;
}
}
}
2、多线程需要访问的代码不一致
可以用多个Runable对象或者多个Runable实现类:
(1)用多个Runable对象,如下:
/**
* 多线程访问共享对象和数据的方式
* 方式二:共享的代码不一样
*
* @author xiao
*
*/
public class MultiThreadShareData2 {
public static void main(String[] args) {
// 第一种方式:在各个线程的中共用一个对象,在各自的run()方法中执行共用对象的不同代码
final ShareData2 data1 = new ShareData2();
new Thread(new Runnable() {
@Override
public void run() {
data1.decrement();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
data1.increment();
}
}).start();
}
}
class ShareData2 {
private int j = 0;
public synchronized void increment() {
j++;
}
public synchronized void decrement() {
j--;
}
}
(2)使用多个Runable实现类,如下:
/**
* 多线程访问共享对象和数据的方式
* 方式二:共享的代码不一样
*
* @author admin
*
*/
public class MultiThreadShareData3 {
public static void main(String[] args) {
// 第二种方式:定义多个Runnable的实现类,然后再不同的Runnable实现类中执行公用对象的不同代码
ShareData3 data3 = new ShareData3();
new Thread(new MyRunnable1(data3)).start();
new Thread(new MyRunnable2(data3)).start();
}
}
class MyRunnable1 implements Runnable {
private ShareData3 data3;
public MyRunnable1(ShareData3 data3) {
this.data3 = data3;
}
@Override
public void run() {
data3.decrement();
}
}
class MyRunnable2 implements Runnable {
private ShareData3 data3;
public MyRunnable2(ShareData3 data3) {
this.data3 = data3;
}
@Override
public void run() {
data3.increment();
}
}
class ShareData3 {
private int j = 0;
public synchronized void increment() {
setJ(getJ() + 1);
}
public synchronized void decrement() {
setJ(getJ() - 1);
}
public int getJ() {
return j;
}
public void setJ(int j) {
this.j = j;
}
}