确保多线程操作的是同一个共享资源

共享资源定义为成员变量

run()定义在内部类中,这样,内部类中的线程就可以直接访问同一份资源了

package thread;
/**
 * 多线程共享资源的方式一:
 * 
 * 操作共享资源的run()放到内部类中,然后操作外部类中定义的资源
 * 
 * 1个线程负责加,1个线程负责减
 */
public class ShareDataStyle1 {
	
	private int sharedData = 100;
	
	public synchronized void add() {
		sharedData++;
		System.out.println(Thread.currentThread().getName()+" add:" + sharedData);
	}
	
	public synchronized void minus() {
		sharedData--;
		System.out.println(Thread.currentThread().getName()+" minus:" + sharedData);
	}
	
	//内部类访问外部类的共享资源
	class Add implements Runnable {
		public void run() {
			while(true) 
				add();
		}
	}
	
	//内部类访问外部类的共享资源
	class Minus implements Runnable {
		public void run() {
			while(true) 
				minus();
		}
	}
	
	public static void main(String[] args) {
		ShareDataStyle1 sharedDate = new ShareDataStyle1();
		new Thread(sharedDate.new Add()).start();
		new Thread(sharedDate.new Minus()).start();
	}
	
}

共享资源在外部单独定义

然后,通过Runnable子类构造方法传入同一个资源即可

package thread;


/**
 * 多线程共享资源的方式二:
 * 
 * 将共享资源传递到不同的Runnable对象中
 * 
 * 1个线程负责加,1个线程负责减
 */
public class ShareDataStyle2 {
	
	public static void main(String[] args) {
		SharedData data = new SharedData();
		new Thread(new Add(data)).start();
		new Thread(new Minus(data)).start();
	}
	
}


class SharedData {
	private int sharedData = 100;
	
	public synchronized void add() {
		sharedData++;
		System.out.println(Thread.currentThread().getName()+" add:" + sharedData);
	}
	
	public synchronized void minus() {
		sharedData--;
		System.out.println(Thread.currentThread().getName()+" minus:" + sharedData);
	}
}

class Add implements Runnable {
	SharedData sharedData;
	public Add(SharedData sharedData) {
		this.sharedData = sharedData;
	}
	
	public void run() {
		while(true) 
			sharedData.add();
	}
}

class Minus implements Runnable {
	SharedData sharedData;
	public Minus(SharedData sharedData) {
		this.sharedData = sharedData;
	}
	
	public void run() {
		while(true) 
			sharedData.minus();
	}
}

猜你喜欢

转载自just2learn.iteye.com/blog/2070603