问题:如何起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();
}
}
本文探讨了在编程中如何实现多个线程同时访问同一资源的问题,通过三个不同示例展示如何控制线程同步,以确保资源的安全访问。在第一个例子中,虽然尝试了多线程操作,但并未达到预期效果。第二个和第三个例子逐步改进,最终成功实现了并发访问和资源的正确管理。

被折叠的 条评论
为什么被折叠?



