多线程卖票(一)
上代码:
public class ThreadDemo extends Thread {
private static int num = 10;
public void run() {
while(num>0)
{
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"-->"+num--);
}
}
}
public class Demo {
public static void main(String[] args) {
ThreadDemo t1 = new ThreadDemo();
ThreadDemo t2 = new ThreadDemo();
ThreadDemo t3 = new ThreadDemo();
ThreadDemo t4 = new ThreadDemo();
t1.start();
t2.start();
t3.start();
t4.start();
}
}
代码结果分析:
由结果可以看到,有负数的票和重复的票被卖出,可是我已经设置了num>0 , 为什么还有负的呢?
- 打印负数的解释
假如执行到num=1,此时0123这四个线程同时在if判断语句和sop语句之间等待执行权,处于临时阻塞状态,这时假如cpu切换到0线程,这时打印出1,num–,num=0,然后假如cpu切换到1线程,这时打印出来的就是0,接着假如cpu切换到2线程,这时打印出来的就是-1。