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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马张平 中级黑马   /  2012-3-23 19:15  /  2399 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Ticked extends Thread
{
        private static int tick = 100;
        Object obj=new Object();
        public void run()
        {
                while (true)
                {
                        synchronized(obj)
                        {
                                if (tick>0)
                                {
                                        try{Thread.sleep(10);}catch(Exception e) {}
                                        System.out.println(this.getName()+"还剩"+tick--+"票");
                                        ;
                                }
                        }
                }
        }
}

class Tick
{
        public static void main(String[] args)
        {
                Ticked t1 = new Ticked();
                Ticked t2 = new Ticked();
                t1.start();
                t2.start();
        }
}
为什么这样还能打出0号票来呢?求解!

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

7 个回复

倒序浏览
Ticked t1 = new Ticked();
Ticked t2 = new Ticked();
你这两个线程操作一个共享数据private static int tick = 100;  当然会出现这个错误,你把你程序改为Ticked t1 = new Ticked();
Thread th1 = new Thread(t1);
Thread th2 = new Thread(t1);
th1.start();
th2.start();  你再试试。
回复 使用道具 举报
你创建了两个线程对象,使用Object obj=new Object()创建了两个不同的对象,使用了不同的锁。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
  1. class Ticked extends Thread
  2. {
  3.         private static int tick = 100;
  4.                
  5.                 Object obj;
  6.                 public Ticked(Object obj)
  7.                 {
  8.                         this.obj=obj;
  9.                 }
  10.         
  11.         public void run()
  12.         {
  13.                 while (true)
  14.                 {
  15.                         synchronized(obj)
  16.                         {
  17.                                 if (tick>0)
  18.                                 {
  19.                                         try{Thread.sleep(10);}catch(Exception e) {}
  20.                                         System.out.println(this.getName()+"还剩"+tick--+"票");
  21.                                         //;
  22.                                 }
  23.                         }
  24.                 }
  25.         }
  26. }

  27. class Tick
  28. {
  29.         public static void main(String[] args)
  30.         {
  31.                                 Object obj=new Object();
  32.                 Ticked t1 = new Ticked(obj);
  33.                 Ticked t2 = new Ticked(obj);
  34.                 t1.start();
  35.                 t2.start();
  36.         }
  37. }
复制代码
如果使用继承Thread用上面的代码试一下。
最好实现Runnable,由一个对象创建多个进程,数据是共享的。
回复 使用道具 举报
你用的不是共享数据,两个线程各持有一份ticket
回复 使用道具 举报
杨朝辉 发表于 2012-3-23 19:34
你创建了两个线程对象,使用Object obj=new Object()创建了两个不同的对象,使用了不同的锁。 ...

关键的问题可不是这个哦
回复 使用道具 举报
房宝彬 发表于 2012-3-24 00:39
关键的问题可不是这个哦

如果使用两个线程对象对类中同一个成员变量操作,只能将成员变量声明成静态的。不知道关键点在哪?
回复 使用道具 举报
Ticked t1 = new Ticked();  t1.start();
哥们,首先你没有创建线程,而且使用的是两个对象。只是两个对象在调用一把加了锁的方法。
这不叫多线程;Ticked 只是继承了Thread类,所以俩对象都可以使用父类的start方法。

主函数中,你应该修改成:
Ticked t = new Ticked();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.start();
t2.start();
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马