问题:如何起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();
}
}