黑马程序员技术交流社区
标题:
程序运行结束后的一点疑惑
[打印本页]
作者:
love~陌
时间:
2014-1-2 16:25
标题:
程序运行结束后的一点疑惑
本帖最后由 love~陌 于 2014-1-2 16:26 编辑
代码如下:(毕老师的入门视频>>买票的例子)
复制代码
class Ticket extends Thread
{
private static int tick=100;
public void run()
{
while (true)
{
if (tick>0)
{
System.out.println(currentThread().getName()+"sale:"+tick--);
}
}
}
}
class TicketDemo
{
public static void main(String[] args)
{
Ticket t1=new Ticket();
Ticket t2=new Ticket();
Ticket t3=new Ticket();
Ticket t4=new Ticket();
t1.start();
t2.start();
t3.start();
t4.start();
System.out.println("Hello World!");
}
}
复制代码
运行结束后.png
(30.6 KB, 下载次数: 16)
下载附件
2014-1-2 16:23 上传
运行之后
运行之前.png
(16.63 KB, 下载次数: 19)
下载附件
2014-1-2 16:23 上传
运行之前是这样子
作者:
其LovE斤
时间:
2014-1-2 20:03
你的问题出在你的成员变量是静态上,同时也出在死循环上。
在主函数中你创建了4个Ticket 对象。在堆内存中开辟了4片空间。
也就是说每个对象都有自己单独的内存地址,有自己单独的run方法。
但是这里要注意:
你的tick是静态成员变量,被所有对象所共享,也就是说在内存中有且只有一份
你在这里是调用了继承与Thread的start方法。当做线程开始运行
这个时候就有5个线程在同时抢CPU执行权。主线程 和你创建的4个线程。
在你的运行过程中 主线程的 hello word 肯定输出过一次。
System.out.println(currentThread().getName()+"sale:"+tick--);
。不会出现一个线程没有执行完,被别的线程抢走。也因为tick是静态的。所以数字不会重复
当某个线程的tick 减少到0的时候。
开始进入
while(true){
if (tick>0){
//这里不会再执行
}
}
CPU的运行速度很快,这样死循环会非常的耗费你的内存资源。4个线程都在死循环。
每个线程都在不停的消耗系统资源。。当心你的电脑卡死哦。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2