黑马程序员技术交流社区
标题:
毕老师同步锁部分有个疑问
[打印本页]
作者:
Jim-剣◆﹏
时间:
2013-9-27 11:11
标题:
毕老师同步锁部分有个疑问
本帖最后由 Jim-剣◆﹏ 于 2013-9-27 13:44 编辑
class Ticket implements Runnable
{
private int tick = 100;
public void run()
{
while(true)
{
this.show();
}
}
}
public synchronized void show()
{
if(tick>0)
{
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"....show.... : "+ tick--);
}
}
}
class ThisLockDemo
{
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);
t1.start();
t2.start();
t3.start();
}
}
复制代码
毕老师的java基础看到了“第11天-12-多线程(多线程-同步函数的锁是this)”中间五分钟断一段代码执行十分不理解
主要是这段
class Ticket implements Runnable
{
private int tick = 100;
public void run()
{
while(true)
{
this.show();
}
}
}
复制代码
在run()方法里面,有个while循环,而且条件一直为true,那么就会一直调用show();
下面主函数创建了三个对象分别为t1,t2,t3,假设t1先抢到CPU进入到执行阶段,并且通过了while判断,那么应该是t1永远出不来了,因为while条件一直为真,只能不断执行show();
问题是毕老师在演示的时候竟然成功地实现了多线程,并没有出现我以上所说的情况,这是为什么呢
望黑马大神赐教
作者:
胡智
时间:
2013-9-27 11:48
这个是CPU运行的机制问题,CPU是根据线程的优先级,随机地不断跳转地运行线程。
创建T1线程并运行后,是T1线程在while循环里面不断循环,而不是CPU陷在while循环里面。CPU运行一段时间T1线程后,还可以调到其他线程运行。除非T1线程通过join()方法插队,才会让T1线程运行结束后再运行其他线程。你再看看毕老师对线程的解释。
作者:
Jim-剣◆﹏
时间:
2013-9-27 12:02
胡智 发表于 2013-9-27 11:48
这个是CPU运行的机制问题,CPU是根据线程的优先级,随机地不断跳转地运行线程。
创建T1线程并运行后,是T1 ...
仔细想了下,懂了。还是因为没从以前单线程那种思维转换出来。就算while条件一直为真也不影响cpu的跳转,其实就和for(int i=0;i<10;i++)一个道理,不是非得执行完十次cpu才会跳转
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2