热爱之心略略略 2021-04-28 22:13 采纳率: 66.7%
浏览 39
已采纳

为什么线程1一直在用着?

模拟售票的过程

 

这是 SEllTicketDemo

public class SellTicketDemo {
    public static void main(String[] args)
    {
        SellTicket st = new SellTicket();

        Thread thread1 = new Thread(st,"窗口1");
        Thread thread2 = new Thread(st,"窗口2");
        Thread thread3 = new Thread(st,"窗口3");

        thread2.setPriority(10);

        thread1.start();
        thread2.start();
        thread3.start();
    }
}

这是SellTicket类

public class SellTicket implements Runnable{
    private int ticket = 1;
    private Object object = new Object();
    @Override
    public void run() {
        while (true)
        {
            synchronized (object)
            {
                if(ticket<=100)
                {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() +":正在出售第" + ticket +"张票");
                    ticket++;
                }
                else
                {
                    System.out.println("已售完");
                }
            }
        }
    }
}

下面是运行的结果

  • 写回答

3条回答 默认 最新

  • 关注

    synchronized (object)这个同步代码有问题,锁死了,别的线程进不去。把object改为this

    package T13;

    /**
     * 模拟车站售票系统
     * 
     * */
    public class Ticket implements Runnable {

        //车票数量
        int ticketCount=100;
        @Override
        public void run() {
            saleTicket2();
        }
        //卖票
        public synchronized void saleTicket(){
            //临界点,要用互斥锁实现同步
            /**
             * 1.函数级的同步:synchronized
             * 2.语句块的同步:synchronized
             * */
            try{
                while(ticketCount>0){
                    String name = Thread.currentThread().getName();
                    ticketCount = ticketCount-1;
                    System.out.println(name+"卖了一张票,还剩"+ticketCount+"张票");
                    Thread.sleep(100);
                }
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        public void saleTicket2(){
            //临界点,要用互斥锁实现同步
            /**
             * 1.函数级的同步:synchronized
             * 2.语句块的同步:synchronized
             * */
            try{
                while(true){
                    //需要锁,锁就是一个Object类型的变量
                    synchronized (this) {//临界点
                        if(ticketCount<1)
                            break;
                        String name = Thread.currentThread().getName();
                        ticketCount = ticketCount-1;
                        System.out.println(name+"卖了一张票,还剩"+ticketCount+"张票");
                        Thread.sleep(10);
                    }
                }
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        public static void main(String[] args) {
            Ticket ticket = new Ticket();
            new Thread(ticket,"售票员1").start();
            new Thread(ticket,"售票员2").start();
            new Thread(ticket,"售票员3").start();
            new Thread(ticket,"售票员4").start();
            
        }
    }
     

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 在获取boss直聘的聊天的时候只能获取到前40条聊天数据
  • ¥20 关于URL获取的参数,无法执行二选一查询
  • ¥15 液位控制,当液位超过高限时常开触点59闭合,直到液位低于低限时,断开
  • ¥15 marlin编译错误,如何解决?
  • ¥15 有偿四位数,节约算法和扫描算法
  • ¥15 VUE项目怎么运行,系统打不开
  • ¥50 pointpillars等目标检测算法怎么融合注意力机制
  • ¥20 Vs code Mac系统 PHP Debug调试环境配置
  • ¥60 大一项目课,微信小程序
  • ¥15 求视频摘要youtube和ovp数据集