java多线程卖票_java多线程的卖票问题

展开全部

首先,定义的锁(lock)不对,必须是同一e69da5e887aa62616964757a686964616f31333335313235个锁,像你这样用this,new多少个MyThread就有多少个锁,违反了线程的同步机制;

其次,你如果想要呈现多线程的竞争,不可以在run方法里让一个线程一直运行而不释放锁,应该使用wait()/notify();

以下我稍微修改下,会形成两个线程交替执行的情形:public class ThreadTest {

public static Object obj = new Object();

public static int number = 10;// 用static共享票源,不知道可以不,按理说是可以的

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

MyThread my = new MyThread();

MyThread my2 = new MyThread();

Thread t1 = new Thread(my2, "2号窗口");

Thread t2 = new Thread(my, "1号窗口");

t1.start();

t2.start();

}

static class MyThread implements Runnable {

public void run() {

while (true)

synchronized (obj) {

if (number > 0) {

System.out.println(Thread.currentThread().getName()

+ "正在卖票," + "还剩" + number + "张票");

number--;

obj.notifyAll();

try {

obj.wait();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

} else

break;

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值