| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1663 人关注过本帖
标题:启动了四个线程,为什么只执行了一个
只看楼主 加入收藏
看谁都是你
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2016-10-13
结帖率:57.14%
收藏
已结贴  问题点数:5 回复次数:3 
启动了四个线程,为什么只执行了一个
运行结果只有携程卖票,其他的线程却不卖,请问是为什么


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();        
    }
}
搜索更多相关主题的帖子: 启动 线程 Thread new start 
2017-10-13 19:53
嗨呀你是谁
Rank: 1
等 级:新手上路
威 望:1
帖 子:4
专家分:7
注 册:2017-10-13
收藏
得分:2 
线程同步的原因,当 携程 使用mr里的run()时,其他线程不能使用。携程使用完后mr.ticketscount等于0了,其他线程执行不了while。
2017-10-13 20:14
看谁都是你
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2016-10-13
收藏
得分:0 
回复 2楼 嗨呀你是谁
那不使用同步的话,卖票数量就不按顺序来了怎么办
某次执行结果:
程序代码:
携程卖出了一张票,还剩9张票
12306卖出了一张票,还剩7张票
手机客户端卖出了一张票,还剩8张票
途牛卖出了一张票,还剩9张票
手机客户端卖出了一张票,还剩4张票
手机客户端卖出了一张票,还剩2张票
手机客户端卖出了一张票,还剩1张票
手机客户端卖出了一张票,还剩0张票
途牛卖出了一张票,还剩3张票
12306卖出了一张票,还剩5张票
携程卖出了一张票,还剩6张票
2017-10-13 20:20
calix
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:28
帖 子:249
专家分:1442
注 册:2015-5-4
收藏
得分:3 
@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 + "张票");
        }
    }
}
2017-10-13 21:00
快速回复:启动了四个线程,为什么只执行了一个
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016663 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved