黑马程序员技术交流社区
标题: 关于多线程的问题 [打印本页]
作者: 京鱼龙 时间: 2012-7-21 14:06
标题: 关于多线程的问题
本帖最后由 罗京雨 于 2012-7-22 10:17 编辑
毕老师讲的车票问题
class Ticket implements Runnable
{
private int num = 200;
Object obj = new Object();
public void run()
{
while(true)
{
synchronized(obj)
{
if(num>0) //这里打印出来能出现0,-1,-2票的问题。我不明白的是num=0了,下面的就不运行了,怎么还会出现-1,-2呢?车票在thread-0,thread-1,thread- 2, thread-3,thread-4,四个线程之间来回切换。假如thread-0卖了最后一张票num=0,if判断不对,应该停止了下面3个线程的切换了。-1,-2怎么得来的
{
try{Thread.sleep(10);}catch(InterruptedException e){}
System.out.println(Thread.currentThread().getName()+".....sale....."+num--);
}
}
}
}
}
class ThreadSynDemo
{
public static void main(String[] args)
{
Ticket t = new Ticket();
//创建线程对象。
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
求大侠们帮忙解答啊
作者: 丁二跃 时间: 2012-7-21 14:15
if(num>0) {
//假设 num =1 时候 thread-0 判断 num>0 成立 进入 在 下一句 休眠了 一会儿 这个时候 num 还是 1
// 如果另一个线程 thread-1 执行到这里 判断 num>0 是不是也会执行……所以num 将要被减两次……如果多个线程在 num 被减前 进入 这段代码 ,那 num 将被减多次了……
try{Thread.sleep(10);}catch(InterruptedException e){}
System.out.println(Thread.currentThread().getName()+".....sale....."+num--);
}
作者: 徐帅 时间: 2012-7-21 15:28
线程的执行:
因为多个线程都获取cpu的执行权。cpu执行到谁,谁就运行。
明确一点,在某一个时刻,只能有一个程序在运行。(多核除外)
cpu在做着快速的切换,以达到看上去是同时运行的效果。
我们可以形象把多线程的运行行为在互相抢夺cpu的执行权。
这就是多线程的一个特性:随机性。谁抢到谁执行,至于执行多长,cpu说的算。
所以某一线程的在执行if(num>0)之后可能立即被其他线程抢到执行权,还没来得及执行num--
再次进行if(num>0) 判断,仍然满足,所以后来依次执行num--,具体结果出现-1,-2,这都是
可能的,要看线程的状态
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |