为什么只能进第一个线程

img

img

img
请大家,为什么我i的代码它只进去了第一个线程,后面两个没有进去,我感觉我的代码没有错啊,5555求解求解

测试代码:
公共资源类

package com.test.thread;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 共享资源,这里就是100张票
 * @author Jiyh
 *
 */
public class Tickets {

    //总票数
    private int tickets = 10;
    
    //锁
    private Lock lock = new ReentrantLock();
    
    public int sellTicket(){
        int currTicket = 0;
        try {
            lock.lock();
            if(tickets > 0){
                currTicket = tickets;
                tickets--;
            }
             
        } catch (Exception e) {
            // TODO: handle exception
        }finally{
            lock.unlock();
        }
        return currTicket;
    }
}

线程类

package com.test.thread;

public class SellTicket implements Runnable {
    
    //公共资源对象
    private Tickets tickets;
    
    public SellTicket(Tickets tickets){
        this.tickets = tickets;
    }
    
    @Override
    public void run() {
        while (true){
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            int ticket = tickets.sellTicket();
            if(ticket <= 0){
                System.out.println(Thread.currentThread().getName()+"->票卖完了,退出");
                break;
                
            }
            System.out.println(Thread.currentThread().getName()+"->卖出第"+ticket+"张票");
        }

    }

}

测试类

package com.test.thread;

public class Test {

    public static void main(String[] args) {
        Tickets tickets = new Tickets();//公共资源,同一个对象传给不同线程
        
        SellTicket st1 = new SellTicket(tickets);
        Thread t1 = new Thread(st1, "窗口一");
        
        SellTicket st2 = new SellTicket(tickets);
        Thread t2 = new Thread(st1, "窗口二");
        
        SellTicket st3 = new SellTicket(tickets);
        Thread t3= new Thread(st1, "窗口三");
        
        t1.start();
        t2.start();
        t3.start();
        
    }
}

结果

img

img

只创建了一个Runnable对象(st),传给了3个Thread。st传给了第一个Thread,后两个Thread获取不到st。
改成创建3个Runnable对象,分别传给3个Thread。

你的tickets不是共享变量,每个线程都有自己的tickets变量,相当于每个窗口都有100张票,各卖各的;