黑马程序员技术交流社区

标题: 一共有1000张电影票,可以在两个窗口领取,假设每次领取的... [打印本页]

作者: kangnam    时间: 2016-9-16 23:11
标题: 一共有1000张电影票,可以在两个窗口领取,假设每次领取的...
一共有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--+"张票");
                                }
                        }
                }
        }
}

作者: warsong    时间: 2016-9-16 23:46
我觉得你的最后卖票结果打印出来会是两行啊
作者: kangnam    时间: 2016-9-17 00:00
warsong 发表于 2016-9-16 23:46
我觉得你的最后卖票结果打印出来会是两行啊

忘了,是有2行,该怎么解决,我试了下放main里面,结果第一就输出来了
作者: zzdhm    时间: 2016-9-17 00:14
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)+"张");       
                        }
                       
                }


作者: taozhihui    时间: 2016-9-17 00:16
赞一个......不错
作者: kangnam    时间: 2016-9-17 00:30
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
kangnam 发表于 2016-9-17 00:30
你得分开记呢

你可以跑一下看看,就知道结果是没有错的,  count放在run()方法里,可以区分不同线程的计数的
作者: kangnam    时间: 2016-9-17 00:50
zzdhm 发表于 2016-9-17 00:39
你可以跑一下看看,就知道结果是没有错的,  count放在run()方法里,可以区分不同线程的计数的 ...

恩,学习了,没想到,看来我的复杂了。
你得把num-- ;不然会出现0值
作者: haoge349    时间: 2016-9-17 00:52
路过,看看,以后再来
作者: SunCowbee    时间: 2016-9-17 01:11
我们今天作业也差不多做这
作者: warsong    时间: 2016-9-17 08:16
打印时候判断正在运行的是哪个线程就好了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2