A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© love~陌 中级黑马   /  2014-1-2 16:25  /  1386 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 love~陌 于 2014-1-2 16:26 编辑
  1. 代码如下:(毕老师的入门视频>>买票的例子)
复制代码

  1. class Ticket extends Thread
  2. {
  3.         private static int tick=100;
  4.         public void run()
  5.         {
  6.                 while (true)
  7.                 {
  8.                         if (tick>0)
  9.                         {
  10.                                 System.out.println(currentThread().getName()+"sale:"+tick--);
  11.                         }
  12.                        
  13.                 }
  14.         }
  15. }
  16. class  TicketDemo
  17. {
  18.         public static void main(String[] args)
  19.         {
  20.                 Ticket t1=new Ticket();
  21.                 Ticket t2=new Ticket();
  22.                 Ticket t3=new Ticket();
  23.                 Ticket t4=new Ticket();

  24.                 t1.start();
  25.                 t2.start();
  26.                 t3.start();
  27.                 t4.start();

  28.                 System.out.println("Hello World!");
  29.         }
  30. }
复制代码


运行结束后.png (30.6 KB, 下载次数: 18)

运行之后

运行之后

运行之前.png (16.63 KB, 下载次数: 23)

运行之前是这样子

运行之前是这样子

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

1 个回复

倒序浏览
你的问题出在你的成员变量是静态上,同时也出在死循环上。
在主函数中你创建了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个线程都在死循环。
每个线程都在不停的消耗系统资源。。当心你的电脑卡死哦。。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马