永发信息网

java多线程问题:模拟10个人在3个窗口买票的过程

答案:4  悬赏:80  手机版
解决时间 2021-03-28 07:33
  • 提问者网友:浪荡绅士
  • 2021-03-27 14:22
java多线程问题:模拟10个人在3个窗口买票的过程
最佳答案
  • 五星知识达人网友:琴狂剑也妄
  • 2021-03-27 15:48
run()方法不对,没有控制同步,如下修改:

public void run()
{
while(true)
{
synchronized(this){
if(number>0){
System.out.println("第"+number+"个人在"+Thread.currentThread().getName()+"买票");
number--;
}
}
}
}
全部回答
  • 1楼网友:北城痞子
  • 2021-03-27 19:53
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个,达不到同步的目的。
如果还有不明白的,可以继续问。
  • 2楼网友:天凉才是好个秋
  • 2021-03-27 18:24
应该加一个同步的控制,否则可能几个线程同时访问number
把System.out.println("第"+number+"个人在"+Thread.currentThread().getName()+"买票");
number--;
这段放到一个加synchronized 修饰的函数中,再在run中调用,如果你在run中加锁的话,第一个访问的线程只有完全运行完while后才解锁,其他线程判断number为0就不执行while了。
  • 3楼网友:白昼之月
  • 2021-03-27 16:55
class SellThread implements Runnable
{
private int number;
SellThread()
{
number=10;
}
public void run()
{
while(number>0)
{
m();
number--;
curentThread,sleep(1000);
}
}
public synchronized void m(){
System.out.println("第"+number+"个人在"+Thread.currentThread().getName()+"买票");
}
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯