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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吹血弄花 中级黑马   /  2014-4-12 01:52  /  1087 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 吹血弄花 于 2014-4-12 20:49 编辑

class Ticket implements Runnable
{
        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(Thread.currentThread().getName()+"sale:"+tick--);
                                }
                        }
                }
        }
}
class  TicketDemo
{
        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);
                /*
                Ticket t1=new Ticket();
                Ticket t2=new Ticket();
                Ticket t3=new Ticket();
                Ticket t4=new Ticket();*/
                t1.start();
                t2.start();
                t3.start();
                t4.start();
        }

}
照着教程一步步敲出来的,为什么我的只有0线程打印啊?教程中是4个线程都打印的。

点评

或者你把票数调多点,或者在执行完所里面的代码之后,让线程休息一下,要其他线程后补 Thread.sleep()这函数是不释放锁的,可能是0线程一直前瞻  发表于 2014-4-12 02:15

评分

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

查看全部评分

5 个回复

倒序浏览
这是个人电脑问题,你多尝试几次,就会看见并发了,并发存在很多因素,很难很好的掌控
回复 使用道具 举报
                t1.start();   修改成     t1.start();
                t2.start();                 t1.yield();
                t3.start();                  t2.start();
                t3.start();                  t3.start();
                 t4.start();                  t4.start();           
   由于线程是由CPU随机抢夺执行权的  所以你也可以多执行几次该程序   也能看到其他线程了
              
                t4.start();   
回复 使用道具 举报
CUP会抢资源执行,抢夺的机会是随机的,多运行几次或许就能出线别的结果了,或者将Tickets的值取大一点1000或者10000
还可以让休眠的时间加长,改为1000
回复 使用道具 举报
吹血弄花 来自手机 中级黑马 2014-4-12 20:45:03
报纸
哦哦,我还以为是java版本差异,谢谢各位
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马