概述
多线程实现售票
- 核心是共享资源的线程安全,因为如果不限制对共享数据的访问,就会导致出现卖同一张票,卖多票的情况。
- 票数是共享资源,所以对票数进行访问和修改需要进行同步(排队)。
- 在对票数进行修改的函数上使用synchronized关键字形成同步方法(默认是该类的对象锁)。
- 这样每次代码运行到该处都会去锁池查看该对象锁是否空闲,空闲就获取锁并进入函数,如果已经有其他线程获取了该锁,就排队等待,等到获得锁的线程运行完毕释放锁才可以进行抢夺。(不过如果没有进行线程休眠,大概率会某一个线程刚释放锁,然后又抢到了锁。)
实现代码:
package thread;
public class ThreadTest implements Runnable {
int i = 100;//共享资源
public ThreadTest() {
this.i=100;
}
public ThreadTest(int i) {//构造函数
this.i = i;
}
public void run() {
while (sale()) {//调用sale方法,同时sale返回值作为循环判断条件
try {
Thread.sleep(10);
/*
* 这个睡眠是出现效果的关键,因为cpu的抢夺很快,
* 所以每次线程释放锁的时候都让他休眠一下,
* 这样其他线程就会立刻抢夺时间片,
* 这样多窗口售票效果更明显,
* 哪怕休眠一毫秒效果也很明显*/
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized boolean sale() {//ThreadTest对象锁
if (i > 0) {
System.out.println(Thread.currentThread().getName() + "卖出了第" + i + "张票!");
i--;
return true;
} else {
return false;
}
}
}
测试类:
package thread;
public class ThreadMain {
public static void main(String[] args) {
ThreadTest w=new ThreadTest(10);
Thread t1=new Thread(w);
Thread t2=new Thread(w);
Thread t3=new Thread(w);
t1.setName("t1");
t2.setName("t2");
t3.setName("t3");
t1.start();
t2.start();
t3.start();
}
}
效果:
最后
以上就是土豪煎蛋为你收集整理的多线程实现多窗口售票的全部内容,希望文章能够帮你解决多线程实现多窗口售票所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复