「java模拟卖票」基于java的火车票售票系统
今天给各位分享java模拟卖票的知识,其中也会对基于java的火车票售票系统进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、Java编程 假设有火车票1000张,创建10个线程模拟10个售票点,每个售票点100毫秒售出一张票。
- 2、用java模拟四个售票点,不重复的卖出100张票(票的编号为1--100),售完为止。
- 3、java 多线程模拟火车售票系统问题
- 4、java 中多线程中的四个窗口卖100张票问题 我的答案是
Java编程 假设有火车票1000张,创建10个线程模拟10个售票点,每个售票点100毫秒售出一张票。
package tmp;
public class Test {
private static int k=0;//售出票数
private static int count=1000;//总票数
private static synchronized boolean sell(int n){
if(kcount){
k++;
System.out.println("第"+n+"售票点售出第"+k+"张票");
return true;
}
return false;
}
static class SellPot extends Thread{//售票点
int n;//售票点编号
public SellPot(int n){
this.n=n;
}
public void run(){
while(sell(n)){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
for(int i=1;i=10;i++){
new SellPot(i).start();
}
}
}
//银行汇款
public class Test2 {
private static int k=0;//总汇款
private static synchronized void send(int m,int i,int n){
k+=m;
System.out.println("第"+n+"个顾客进行第"+(i+1)+"次汇款,银行接收总汇款"+k);
}
static class Costum extends Thread{//售票点
int n;//顾客编号
public Costum(int n){
this.n=n;
}
public void run(){
for(int i=0;i3;i++){
send(100,i,n);//汇款100
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
for(int i=1;i=3;i++){
new Costum(i).start();
}
}
}
用java模拟四个售票点,不重复的卖出100张票(票的编号为1--100),售完为止。
public class ShowDemo{
public static void main(String[] rags)throws Exception{
MyThread mt= new MyThread();
Thread th1 = new Thread(mt,"售票一");
Thread th2 = new Thread(mt,"售票二");
Thread th3 = new Thread(mt,"售票三");
Thread th4 = new Thread(mt,"售票四");
th1.start();th2.start();th3.start();th4.start();
}
}
class MyThread implements Runnable{
int ticket=1;
public void run(){
while(ticket=100){
if("售票一".equals(Thread.currentThread().getName()) ticket%2!=0){
System.out.println("售票一售出:"+ticket++);
}
if("售票二".equals(Thread.currentThread().getName()) ticket%2!=0){
System.out.println("售票二售出:"+ticket++);
}
if("售票三".equals(Thread.currentThread().getName()) ticket%2==0){
System.out.println("售票三售出:"+ticket++);
}
if("售票四".equals(Thread.currentThread().getName()) ticket%4==0){
System.out.println("售票四售出:"+ticket++);
}
}
}
}
java 多线程模拟火车售票系统问题
在synchronized(str) 里加一句 if(ticket 0) //判断是否有余票,没有余票还卖什么?
也就是这样:
package socket;
public class Test
{
public static void main(String [] args)
{
TestThread tt=new TestThread();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
}
}
class TestThread implements Runnable
{
int ticket=10;
String str=" ";
public void run()
{
while(ticket0)
{
synchronized(str)
{
if(ticket 0 ) {
System.out.println(Thread.currentThread().getName()+":ticket "+ticket+" is saling");
ticket--;
}
}
}
}
}
你的while循环只是超出票数的循环,在同步里面还要有判断是否有票的条件.因为里面同步的时候除了一个线程在执行外,其它几个都在等待,而此时并没有跳出循环,当然会出现负数了.
当然把while判断放到同步代码里面去也可以.不过这样就没有超出票数的判断了,实际应用中应该有个超出票数的判断.. 例如 :for(int i=0;i100;i++) //同步检测 只有5张票,显示100张,实际上卖出的还是5张..用来检测同步是否正确...
java 中多线程中的四个窗口卖100张票问题 我的答案是
你的答案有两个问题:
1,obj不是static,就是说每个线程都有自己的obj,synchronize锁的是自己线程的obj,不能起到阻塞其它线程的作用。运行的话会看到有的票被出售多次。
2,while (num 0)在syncronize之外,因为没被同步,其它线程可能在对比num 0之后修改num的值,可能导致计数为负数的票被卖出,或者其它奇怪的结果。
所以最后的答案才能得到可靠的结果。
java模拟卖票的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于基于java的火车票售票系统、java模拟卖票的信息别忘了在本站进行查找喔。
发布于:2022-12-01,除非注明,否则均为
原创文章,转载请注明出处。