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