热爱之心略略略 2021-04-28 14: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条)
编辑
预览

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部