注册 登录
编程论坛 JAVA论坛

启动了四个线程,为什么只执行了一个

看谁都是你 发布于 2017-10-13 19:53, 1840 次点击
运行结果只有携程卖票,其他的线程却不卖,请问是为什么


class MyRunnable implements Runnable{
    private Integer ticketscount=1000;
    @Override
    public void run() {
        synchronized(this){
            while(ticketscount>0){
                System.out.println(Thread.currentThread().getName()+"卖出了一张票,还剩"+--ticketscount+"张票");
            }
        }
        
    }
   
}
public class TicketsRunnable{
    public static void main(String [] args){
        MyRunnable mr=new MyRunnable();
        Thread th1=new Thread(mr,"携程");
        Thread th2=new Thread(mr,"途牛");
        Thread th3=new Thread(mr,"12306");
        Thread th4=new Thread(mr,"手机客户端");
        th1.start();
        th2.start();
        th3.start();
        th4.start();        
    }
}
3 回复
#2
嗨呀你是谁2017-10-13 20:14
线程同步的原因,当 携程 使用mr里的run()时,其他线程不能使用。携程使用完后mr.ticketscount等于0了,其他线程执行不了while。
#3
看谁都是你2017-10-13 20:20
回复 2楼 嗨呀你是谁
那不使用同步的话,卖票数量就不按顺序来了怎么办
某次执行结果:
程序代码:
携程卖出了一张票,还剩9张票
12306卖出了一张票,还剩7张票
手机客户端卖出了一张票,还剩8张票
途牛卖出了一张票,还剩9张票
手机客户端卖出了一张票,还剩4张票
手机客户端卖出了一张票,还剩2张票
手机客户端卖出了一张票,还剩1张票
手机客户端卖出了一张票,还剩0张票
途牛卖出了一张票,还剩3张票
12306卖出了一张票,还剩5张票
携程卖出了一张票,还剩6张票
#4
calix2017-10-13 21:00
@Override
public void run() {
    synchronized(this){
        while(ticketscount>0){
            System.out.println(Thread.currentThread().getName()+"卖出了一张票,还剩"+--ticketscount+"张票");
        }
    }
}
这种写法,只要任意一个线程先抢到锁,就会一直执行里面的while直到结束
期间不会释放锁,别的线程就不会有机会执行进来
对于这种场景,应该每张票都有可能被不同的客户端卖出去
所以while循环要放到同步锁的外面,ticketscount每次减少,都要进行同步,让线程互相竞争,谁抢到就是谁的。比如:
while (ticketscount > 0) {
    synchronized (this) {
        if (ticketscount > 0) {
            System.out.println(Thread.currentThread().getName() + "卖出了一张票,还剩" + --ticketscount + "张票");
        }
    }
}
1