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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xmmsbb 中级黑马   /  2015-5-18 16:43  /  762 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Ticket extends Thread
{
        private static int num=100;
        public void run()
        {
                while(true)
                {
                        if(num>0)
                        {
                                System.out.println(Thread.currentThread().getName()+".....sale...."+num--);
                        }
                }
        }
}
class ThreadDemo11
{
        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();
        }
}

运行结果:(部分)
Thread-0.....sale....9
Thread-0.....sale....8
Thread-0.....sale....7
Thread-0.....sale....6
Thread-0.....sale....5
Thread-0.....sale....4
Thread-0.....sale....3
Thread-0.....sale....2
Thread-0.....sale....1
Thread-3.....sale....12
Thread-1.....sale....13
Thread-2.....sale....10
为什么输出num时12会在1后面?



评分

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

查看全部评分

8 个回复

倒序浏览
这是一个线程安全的问题。不知道你有没有看过线程安全方面的知识。
Java对于多线程的处理方式是采用轮换的方式。
当Thread-3读取到num的值为13的时候,线程迅速切换成了Thread-1,并且Thread-1执行了一段时间的代码,那个时候num的值已经改变了(就像你的结果中一样num已经变成1了)。然后线程在切换到Thread-3,这个时候因为已经读取到num的值为13了,所以直接输出13。其余的Thread-2类似。
回复 使用道具 举报
真是大牛。线程现在还没学呢。都摆成这样了。拿HMB走人。
回复 使用道具 举报
本帖最后由 大西洋 于 2015-5-18 21:49 编辑

因为Thread-3 在Thread-1之后抢到了资源,所以得以赶紧输出12;线程之间一直在抢资源,或者说CPU会在不同的线程间快速切换~
回复 使用道具 举报
这是多线程的问题啊,不太懂 冒个泡
回复 使用道具 举报
LoseMyCat 发表于 2015-5-18 21:30
这是一个线程安全的问题。不知道你有没有看过线程安全方面的知识。
Java对于多线程的处理方式是采用轮换的 ...

举个简单的例子,假设甲乙两个人各有100个苹果,我拿着一个框轮换着装甲乙两个人的苹果,我装到甲第30个苹果的时候,它已经把第30个苹果拿出来了,结果我去装乙的苹果去了,等我回来还是装甲的第30个苹果。是这个意思吧?
回复 使用道具 举报
xmmsbb 中级黑马 2015-5-19 09:30:13
7#
0416朱珅平 发表于 2015-5-18 21:57
这是多线程的问题啊,不太懂 冒个泡

哈哈,看上面其他大牛的回帖
回复 使用道具 举报
线程1、2、3跟0抢CPU执行权,没抢过。4个线程,一个控制台,随意会发生这种随机现象
回复 使用道具 举报
因为当Thread1 和2 和3 ,刚拿到数据,还没打印出来的时候,CPU执行权被Thread 0 抢到了 。并且被他一个劲的输出。最后打印完,Thread 1 。2  。3 分别拿到执行权,打印出了自己的数据。

为了防止发生这种情况,需要对线程进行同步。synchronized
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马