JAVA 多线程 4个售票员卖1000张票 为什么我的是第一张票被1234售票员卖了然后再卖第二章张?请高手解答

classticket{publicintticket=10;inti;Strings;publicsynchronizedvoidshow(inti1,Strings1... class ticket{
public int ticket=10;
int i;
String s;
public synchronized void show(int i1,String s1){
i=i1;
s=s1;
if(ticket>0)
{
ticket--;
System.out.println(s+"卖了"+i+"张票,还剩票数="+ticket);
}
}
} //共同访问的数据

class thr2{
public static void main(String args[]){
thr2 tt=new thr2();
tt.go();
}
public void go(){
ticket f1=new ticket();
p1 r1=new p1(f1);
p2 r2=new p2(f1);
p3 r3=new p3(f1);
p4 r4=new p4(f1);

r1.start();
r2.start();
r3.start();
r4.start();
}
}
class p1 extends Thread{
int i;
ticket fd;
public p1(ticket fd1)
{fd=fd1;}
public void run(){
for(i=1;i<11;i++){
try{
Thread.sleep(1000);
}
catch(InterruptedException e){}

fd.show(i,"售票员1");

}
}
}
class p3 extends Thread{
int i;
ticket fd;
public p3(ticket fd1)
{fd=fd1;}
public void run(){
for(i=1;i<11;i++){
try{
Thread.sleep(1000);
}
catch(InterruptedException e){}

fd.show(i,"售票员3");

}
}
}
class p4 extends Thread{
int i;
ticket fd;
public p4(ticket fd1)
{fd=fd1;}
public void run(){
for(i=1;i<11;i++){
try{
Thread.sleep(1000);
}
catch(InterruptedException e){}

fd.show(i,"售票员4");

}
}
}
class p2 extends Thread{
int i;
ticket fd;
public p2(ticket fd1){fd=fd1;}
public void run(){
for(i=1;i<11;i++){
try{
Thread.sleep(1000);
}
catch(InterruptedException e){}
fd.show(i,"售票员2");
}
}
}
展开
 我来答
a570056568
2013-06-03 · TA获得超过217个赞
知道答主
回答量:146
采纳率:50%
帮助的人:70.2万
展开全部
你在show方法加了同步关键字synchronized啊。这就表示,任意时刻只能有一个线程执行show方法。然后你每个线程里面的for循环都是从1开始循环。因而就是这样的效果:p1线程start之后,sleep1秒钟,锁定并执行完show之后,释放了show的同步锁。线程2开始,依次类推
追问
那怎么解决啊?亲
是再用锁么
追答
用线程池做会简单的多。
ying_2010
2013-06-03 · TA获得超过114个赞
知道小有建树答主
回答量:151
采纳率:50%
帮助的人:87.4万
展开全部
ticket f1=new ticket();每个线程new一个新的
synchronized 把这个去掉

之后试试看
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式