如何使用多个线程访问同一个资源

问题:如何起4个线程同时卖50张票?

第一个例子:

package com.suning.test.thread;

/**
 * 多个线程同时使用同一个资源
 * 本例中,4个线程各自分别卖了50张票(总共卖了200张票,这不是我们希望的结果)
 * 
 * 
 * @author guweiqiang
 */
public class ThreadDemo1 extends Thread {

	private int ticket = 50;

	public void run() {
		while (true) {
			if (ticket > 0) {
				System.out.println(Thread.currentThread().getName() + "is saling ticket" + ticket--);
			} else {
				break;
			}
		}
	}

	public static void main(String[] args) {
		new ThreadDemo1().start();   
		new ThreadDemo1().start();   
		new ThreadDemo1().start();   
		new ThreadDemo1().start(); 
	}
}

 没有达到目的,改进:

package com.suning.test.thread;

/**
 * 多个线程同时使用同一个资源
 * 本例中,4个线程各自分别卖了50张票(总共卖了200张票,这不是我们希望的结果)
 * 但是如果加上static,则可以实现我们的目的
 * 
 * @author guweiqiang
 */
public class ThreadDemo1 extends Thread {

	private static int ticket = 50;

	public void run() {
		while (true) {
			if (ticket > 0) {
				System.out.println(Thread.currentThread().getName() + "is saling ticket" + ticket--);
			} else {
				break;
			}
		}
	}

	public static void main(String[] args) {
		new ThreadDemo1().start();   
		new ThreadDemo1().start();   
		new ThreadDemo1().start();   
		new ThreadDemo1().start(); 
	}
}

 达到了目的。

第二个例子:

package com.suning.test.thread;

/**
 * 多个线程同时使用同一个资源
 * 本例中,4个线程共同卖完50张票
 * 
 * @author guweiqiang
 */
public class ThreadDemo2 extends Thread {

	private int ticket = 50;

	public void run() {
		while (true) {
			if (ticket > 0) {
				System.out.println(Thread.currentThread().getName() + "is saling ticket" + ticket--);
			} else {
				break;
			}
		}
	}

	public static void main(String[] args) {
		ThreadDemo2 t = new ThreadDemo2();
		new Thread(t, "1号窗口").start();   
		new Thread(t, "2号窗口").start();   
		new Thread(t, "3号窗口").start();   
		new Thread(t, "4号窗口").start(); 
	}
}

第三个例子:

package com.suning.test.thread;

/**
 * 多个线程同时使用同一个资源
 * 本例中,4个线程共同卖完50张票
 * 
 * @author guweiqiang
 */
public class ThreadDemo3 implements Runnable {

	private int ticket = 50;

	public void run() {
		while (true) {
			if (ticket > 0) {
				System.out.println(Thread.currentThread().getName() + "is saling ticket" + ticket--);
			} else {
				break;
			}
		}
	}

	public static void main(String[] args) {
		ThreadDemo3 t = new ThreadDemo3();
		new Thread(t, "1号窗口").start();   
		new Thread(t, "2号窗口").start();   
		new Thread(t, "3号窗口").start();   
		new Thread(t, "4号窗口").start(); 
	}
}

猜你喜欢

转载自guwq2014.iteye.com/blog/2366569