java线程关于售票问题

今天还是忙碌在找工作的过程中,今天在做一家公司的笔试题的时候,发现了一道编程题,写结果的。感觉蛮有意思的。所以写出来给大家分享一下。

代码是这样的:大家不妨猜猜结果

当然,我想说说我当时的想法。我觉的线程的start方法就是让线程进入就绪队列,等待着CPU资源,然后访问CPU。这个程序,注意i是静态变量,单独存储在一个地方,所以不管是哪个线程,i的值不再重复从1开始。而且run方法里面有一个synchronized同步,所以答案只会是一个线程的从1到10.我猜想结果应该有三种,要不是A,要不是B,要不是C。所以当时答案就写得是这个。结果咧。。。。。。我就呵呵哒了。避免大家看不完,我就直接在上面解密答案咯。答案就是我猜想的!不过还是建议大家看看我下面的东西,相信大家会有收获的。

package com.xaut.code0927;


public class Ticket implements Runnable{
private static Object obj = new Object();
private static int i = 1;
public void run(){
synchronized(obj){
for(;i<=10;i++){
System.out.println("线程"+Thread.currentThread().getName()+",输出 :"+i);
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Ticket ticket = new Ticket();
Thread threadA = new Thread(ticket,"A");
Thread threadB = new Thread(ticket,"B");
Thread threadC = new Thread(ticket,"C");
threadA.start();
threadB.start();
threadC.start();
}

}

--------------------------------------------------------------------------------------------------------------------

编译器上面的结果是:
线程A,输出 :1
线程A,输出 :2
线程A,输出 :3
线程A,输出 :4
线程A,输出 :5
线程A,输出 :6
线程A,输出 :7
线程A,输出 :8
线程A,输出 :9
线程A,输出 :10
************************************************************************************************
而且我还不信邪的运行了十多次,发现结果还是一样的。不认输的我又进行尝试,把B线程的start方法提前到A线程的start方法之前,结果发现,输出的结果总是第一个调用start方法的那个线程。看到这个结果,我就再想这是为什么呢?
1、同时我还进行了其他的尝试,把start方法全部改成了run方法。发现结果是线程main,而不会其他的线程。同时这个是尝试了十几次的结果。
2、同样,我注意到这个方法是实现了Runnable接口的,我又联想到了创建线程的另一种方法是继承Thread类,我也进行了尝试,同样是多次的尝试。发现这次的结果不一样       了,出现了和我上面预想的结果。

随之充满好奇心的我,在网上找了一下答案。发现有说继承Thread类的,并且重写了run方法,相当于是开了几个窗口,各自卖各自的票,但因为i是静态变量,相当于是总体的票,所以会出现那种结果。
看到那个又说:来自于 许小乖 http://blog.csdn.net/xdd19910505/article/details/50732328
在实现Runnable接口的时候调用ThreadThread(Runnable run)或者Thread(Runnablerun,String name)构造方法创建进程时,使用同一个Runnable实例,建立的多线程的实例变量也是共享的;但是通过继承Thread类是不能用一个实例建立多个线程,故而实现Runnable接口适合于资源共享;当然,继承Thread类也能够共享变量,能共享Thread类的static变量;
看到他的这段话之后,我可以理解了继承Thread类之后出现的那种情况。但是我又想到了实现Runnable那种,相当于是分了卖10张票给三个线程。但是结果为什么只是A,而不是其他两个呢?
所以不信邪的我又重新调成是实现Runnable的那个程序,然后又重新运行了更多的次数,结果发现,竟然不仅仅是A,它还出现了B的情况。那么我上面的猜想是正确的。上面只是因为我尝试的次数太少。


---------------------------------------------------------------------------
说个自己同时也说给大家的话:

有疑问就去尝试,当然往往尝试一遍两遍是远远不够的。要多次去尝试,不要因为发生的概率低就觉得没有发生。多去质疑质疑。相信会再质疑中慢慢成长的。现在是渣滓,但渣滓迟早是会成神的。加油啦,各位。gangbadei!




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值