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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

一共有1000张电影票,可以在两个窗口领取,假设每次领取的时间为3000毫秒,
要求:请用多线程模拟领票过程并打印剩余电影票的数量(假设有a和b两个窗口卖票,并分别统计每个窗口卖了多少张票)

public class Movice {
        public static void main(String[] args) {
                Ticket1 t =new Ticket1();
                Thread s1 =new Thread(t,"a");
                Thread s2 =new Thread(t,"b");
                s1.start();
                s2.start();
        }
}
class Ticket1 implements Runnable{
        private int num =1000;
        private int a = 0 ;
        private int b = 0 ;
        @Override
        public void run() {
                while(true){
                        String name =Thread.currentThread().getName();
                        synchronized (this) {
                                if(num<=0){
                                        System.out.println("a总共卖了:"+a+"张票     " +"   b卖总共卖了:"+b+"张票");
                                        break;
                                }
                                try {
                                        //睡眠3000毫秒(测试设小点,这太慢了)
                                        Thread.sleep(3000);
                                } catch (InterruptedException e) {
                                        e.printStackTrace();
                                }
                                //判断是否是a窗口,是就计数
                                if("a".equals(name)){
                                        a++;
                                        System.out.println(name+"卖第"+num--+"张票");
                                }else if("b".equals(name)){
                                        b++;
                                        System.out.println(name+"卖第"+num--+"张票");
                                }
                        }
                }
        }
}

10 个回复

倒序浏览
我觉得你的最后卖票结果打印出来会是两行啊
回复 使用道具 举报
warsong 发表于 2016-9-16 23:46
我觉得你的最后卖票结果打印出来会是两行啊

忘了,是有2行,该怎么解决,我试了下放main里面,结果第一就输出来了
回复 使用道具 举报
public class Demo {
public static void main(String[] args) {
                new  Piao("a窗口").start();
                new  Piao("b窗口").start();
        }

}
class Piao extends Thread{
        public Piao(String name){
                super(name);
        }
        private static int num =1000;
        public void run(){
                int count=0;
                while(true){
                        synchronized (Piao.class) {
                        if(num<=0){
                                System.out.println(getName()+" 总计卖出电影票"+count+"张");
                                break;
                        }
                        try {
                                sleep(3000);  //这题3000毫秒不科学,要看票卖完要等很长时间的,  如果 3毫秒就差不多
                        } catch (InterruptedException e) {
                               
                                e.printStackTrace();
                        }
                        count++;
                        System.out.println(getName()+" 剩余电影票"+(--num)+"张");       
                        }
                       
                }

回复 使用道具 举报
赞一个......不错
回复 使用道具 举报
zzdhm 发表于 2016-9-17 00:14
public class Demo {
public static void main(String[] args) {
                new  Piao("a窗口").start();

你得分开记呢
回复 使用道具 举报
zzdhm 初级黑马 2016-9-17 00:39:25
7#

你可以跑一下看看,就知道结果是没有错的,  count放在run()方法里,可以区分不同线程的计数的
回复 使用道具 举报
zzdhm 发表于 2016-9-17 00:39
你可以跑一下看看,就知道结果是没有错的,  count放在run()方法里,可以区分不同线程的计数的 ...

恩,学习了,没想到,看来我的复杂了。
你得把num-- ;不然会出现0值
回复 使用道具 举报
haoge349 来自手机 中级黑马 2016-9-17 00:52:19
9#
路过,看看,以后再来
回复 使用道具 举报
我们今天作业也差不多做这
回复 使用道具 举报
打印时候判断正在运行的是哪个线程就好了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马