请大家,为什么我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();
}
}
结果
只创建了一个Runnable对象(st),传给了3个Thread。st传给了第一个Thread,后两个Thread获取不到st。
改成创建3个Runnable对象,分别传给3个Thread。
你的tickets不是共享变量,每个线程都有自己的tickets变量,相当于每个窗口都有100张票,各卖各的;