public class Demo10_5 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//定义三个售票窗口
TicketWindow tw=new TicketWindow();
//使用三个线程同时启动
Thread t1=new Thread(tw);
Thread t2=new Thread(tw);
Thread t3=new Thread(tw);
t1.start();
t2.start();
t3.start();
}
}
class TicketWindow implements Runnable{
//一共两千张票
private int nums=2000;
private Dog myDog=new Dog();
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
//认为if else 要保证其原子性
synchronized (myDog)
{
//判断是否还有票
if(nums>0){
//显示售票信息
//Thread.currentThread().getName()当前线程的名字
System.out.println(Thread.currentThread().getName()+"正在售出第"+nums+"票");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
nums--;
}else {
//售票结束
break;
}
}
}
}
}
class Dog{
}
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
先说为什么三个线程没同步:
因为,没有什么需要同步的。
我猜测你的目的是三个线程同步售出2000张票。
程序中票数是TicketWindow的一个成员变量,而三的线程中各有一个TicketWindow实例。所以三个2000是互不相干的。
最简单的方式是把票数改为static,这样所有TicketWindow实例到使用同一个类成员变量。当然用来锁的dog也需要改为static。
后面是建议:
不要使用new thread方式写多线程,请参考Java concurrent包中Callable等类,在较高抽象级别处理多线程。
最后的建议:
练手写写无所谓,如果是真正要用的代码,不要写多线程同步逻辑!
找可靠的第三方库或者软件来处理。
你这么写没问题啊... 三个线程是在卖2000张票.. 而且是一张一张卖的, 也没重复卖..
不知道你是要问什么问题...
执行的时候, 三个线程不会是顺序来卖票的, 因为cpu的时钟选择哪个是不确定的... 如果你想要顺序卖的话, 逻辑就得都改一下了...
其他的答案... 你们确定看清楚别人是怎么写的了么... 锁是对的, 2000张票也是对的...