本人在学java,在学到线程的时候,遇到了一个问题,希望有高手能帮我解决。 这是一个正确的模拟多站点卖票

2025-01-05 23:27:30
推荐回答(5个)
回答1:

LZ,你的电脑和配置都没问题,是程序有bug,这是一个多线程的程序,tickets这个变量是被t1和t2两个线程共享,加上关键字synchronized 没错,主要问题是,线程t1开始运行后就把变量tickets锁定了,而且在t1执行结束以前都没有放开这个变量(一直在执行循环),当tickets=0的时候线程t1才为它(tickets)解锁,此时线程t2才有机会访问变量tickets,但是此时tickets等于0,故线程t2直接跳出循环,解决的办法很简单,可以让线程t1在执行完一个循环后,把变量tickets解锁一段时间,让线程t2有机会访问它,我让线程t1执行完一个循环就停顿2秒,结果就变成楼主想要的了,一下是我修改后的代码:
class A implements Runnable
{
public int tickets = 100;
String str = new String("哈哈");

public void run()
{
String str = "哈哈";

while (true)
{
synchronized (str)
{
if (tickets > 0)
{
System.out.printf("%s线程正在卖出第%d张票\n",
Thread.currentThread().getName(), tickets);
--tickets;
}
else
{
break;
}
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

public class TestTickets_9
{
public static void main(String[] args)
{
A aa = new A();
Thread t1 = new Thread(aa);
t1.start();

Thread t2 = new Thread(aa);
t2.start();

}
}
测试过了,应该没有错的,希望能帮上LZ

回答2:

朋友,你好,你可以把票数多懂一些,比如说2000张,然后多运行几次,再看看结果,你的处理器好,处理速度快,所以会出现这种情况,我前段时间学线程时也是这种情况,郁闷了我好久,一样的程序和视频中运行出来的结果差别较大,但是多运行几次还是可以看到有线程在交替运行。

回答3:

你要搞清楚 你的两个线程都是共享的是同一个成员变量tickets 而且你是用的线程同步
当第一个线程运行完了以后 也就是当tickets=0的时候第一个线程结束了
第二个线程就开始运行 但是此时的tickets=0 所以第二个线程就进入了else里面
所以就跳出了这个循环 结果肯定只会显示第一个线程运行的结果.....
重点是你要搞清楚 这两个线程共享的是同一个变量.....

回答4:

你这里有两个问题
第一:
main方法里改一下:
A aa = new A();
A aaa = new A();
Thread t1 = new Thread(aa);
t1.start();
Thread t2 = new Thread(aaa);
t2.start();
你原来定义的t1和t2事实上是一个线程,改成这样就是两个线程了。

第二:
如果你想买票Thread-0和1交错出现,那应该把synchronized (str) 去掉,不过这要看你具体的要求了。

回答5:

因为你的程序总是一个线程在跑啊,当然是这样了。你再开几个程序看看都启动他们,看看效果是不是你想要的。一个程序一个线程,启动多个Myeclipse同时运行这个程序。