
正文
java多线程抢票代码,java实现抢票
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
java多线程的卖票问题
首先,定义的锁(lock)不对,必须是同一个锁,像你这样用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;
}
}
}
}
相关问答
Q1: 毕业设计是基于java火车抢票软件开发,思路不清晰,求指点下。
这种东西一般是先去分析12306网站,了解每一步操作的http请求,然后通过java去模拟这些请求就可以了。
但是抢票软件的关键是在于破解其验证码系统,如果这个做不到的花,那么你的东西跟12306没什么区别,没什么价值。现在12306网站验证码变的比较勤,这个难度还是比较大的
多线程似乎也没什么用,都阻塞在了验证码输入上,快不了~ 除非破解验证码
Q2: java多线程问题:模拟10个人在3个窗口买票的过程
public class TicketsSystem {
public static void main(String[] args) {
SellThread st = new SellThread();
Thread th1 = new Thread(st);
th1.start();
Thread th2 = new Thread(st);
th2.start();
Thread th3 = new Thread(st);
th3.start();
}
}
class SellThread implements Runnable {
private int number=10;
String s = new String();
public void run() {
while (number 0) {
synchronized (s) {
System.out.println("第" + number + "个人在"
+ Thread.currentThread().getName() + "买票");
}
number--;
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
synchronized (s)的s是synchronized 的参数,synchronized 的参数可以是任意对象,我定义了一个String类型的对象s,方便看程序而已。
但是要注意,s的定义一定要在run方法之外,不然还会出现负数。因为你启动了3个线程,每个线程都调用了run方法,在每个线程就会在run方法里边产生自己的s对象,一共会产生3个,达不到同步的目的。
如果还有不明白的,可以继续问。
Q3: java 中多线程中的四个窗口卖100张票问题 我的答案是
你的答案有两个问题:
1,obj不是static,就是说每个线程都有自己的obj,synchronize锁的是自己线程的obj,不能起到阻塞其它线程的作用。运行的话会看到有的票被出售多次。
2,while (num 0)在syncronize之外,因为没被同步,其它线程可能在对比num 0之后修改num的值,可能导致计数为负数的票被卖出,或者其它奇怪的结果。
所以最后的答案才能得到可靠的结果。







