「java买票多线程」使用多线程实现火车站买票
今天给各位分享java买票多线程的知识,其中也会对使用多线程实现火车站买票进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、java多线程问题,火车票买票
- 2、java多线程问题:模拟10个人在3个窗口买票的过程
- 3、编写了一个JAVA的售票小程序,多线程实现售票系统,但却无法实现两个线程共享资源,是怎么回事?请指教。
- 4、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买票多线程和使用多线程实现火车站买票的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。