「java买票多线程」使用多线程实现火车站买票

博主:adminadmin 2023-01-08 23:48:06 987

今天给各位分享java买票多线程的知识,其中也会对使用多线程实现火车站买票进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

java多线程问题,火车票买票

楼上答案是正解,你一直用一个对象的在set,共享了同一个对象.其实也没用新建5个对象.

可以set之后就开始执行.但是多线程的意义可能不大了.

package com.experiment9;

public class Ticket extends Thread {

public Ticket(String s){

super(s);

}

int num=100; //静态变量

public void run(){

while(true){

synchronized (" "){ //同步块实现多线程

if(num0){

try {

Thread.sleep(500); //线程休眠10毫秒

}catch (Exception e){

e.printStackTrace();

}

System.out.println(this.getName()+"------------------------"+(num--));

}

}

}

}

public static void main(String[] args) { //main 函数

Ticket ticket =new Ticket("5号窗口");

Thread thread_5=new Thread(ticket);

ticket.setName("一号窗口");

thread_5.start();

Thread thread_1=new Thread(ticket);

ticket.setName("二号窗口");

thread_1.start();

Thread thread_2=new Thread(ticket);

ticket.setName("三号窗口");

thread_2.start();

Thread thread_3=new Thread(ticket);

ticket.setName("四号窗口"); //为什么前面的set那么没用呢?

thread_3.start();

Thread thread_4=new Thread(ticket);

thread_4.start();

}

}

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个,达不到同步的目的。

如果还有不明白的,可以继续问。

编写了一个JAVA的售票小程序,多线程实现售票系统,但却无法实现两个线程共享资源,是怎么回事?请指教。

两个线程(假设为a,b)不共享资源是由于变量是局部变量。

就是线程a下有一个tickets,

线程b下也有一个tickets,

这时tickets变量为2个。

线程a访问的是a下的tickets,

而线程b访问的是b下的tickets,

所以造成了出票结果为200张。

为了避免这种情况,需要在声明的时候把他设置成全局变量

也就是前面要加入static修饰

把int tickets=100;

修改为public static int tickets=100;

这时无论生成几个线程tickets变量只有一个所有的线程同时对他执行操作。

这时就能保证出票数为100张了

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买票多线程和使用多线程实现火车站买票的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。