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

packagesocket;classSellThreadimplementsRunnable{privateintnumber;SellThread(){number=... package socket;
class SellThread implements Runnable
{
private int number;
SellThread()
{
number=10;
}
public void run()
{
while(number>0)
{
System.out.println("第"+number+"个人在"+Thread.currentThread().getName()+"买票");
number--;
}
}
}
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();
}

}
输出不是想要的结果啊?输出如下:
第10个人在Thread-0买票
第9个人在Thread-0买票
第8个人在Thread-0买票
第7个人在Thread-0买票
第6个人在Thread-0买票
第5个人在Thread-0买票
第4个人在Thread-0买票
第3个人在Thread-0买票
第2个人在Thread-0买票
第1个人在Thread-0买票
第10个人在Thread-1买票
第-1个人在Thread-2买票
问题一:
线程执行的次数不对,应该10次,结果12次
问题二:
总是Thread-0在执行,Thread-1,Thread-2没有执行。
public void run()增加同步后为public synchronized void run()
Thread-1,Thread-2还是没有执行
展开
 我来答
百度网友675665c
2011-08-24 · TA获得超过122个赞
知道答主
回答量:72
采纳率:0%
帮助的人:78.9万
展开全部
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个,达不到同步的目的。
如果还有不明白的,可以继续问。
c87091823
推荐于2018-04-21
知道答主
回答量:11
采纳率:0%
帮助的人:15.7万
展开全部
run()方法不对,没有控制同步,如下修改:

public void run()
{
while(true)
{
synchronized(this){
if(number>0){
System.out.println("第"+number+"个人在"+Thread.currentThread().getName()+"买票");
number--;
}
}
}
}
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
luroji
2011-08-16 · TA获得超过2897个赞
知道小有建树答主
回答量:572
采纳率:100%
帮助的人:281万
展开全部
应该加一个同步的控制,否则可能几个线程同时访问number

把System.out.println("第"+number+"个人在"+Thread.currentThread().getName()+"买票");
number--;
这段放到一个加synchronized 修饰的函数中,再在run中调用,如果你在run中加锁的话,第一个访问的线程只有完全运行完while后才解锁,其他线程判断number为0就不执行while了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
fylsh
2011-08-15 · TA获得超过950个赞
知道小有建树答主
回答量:1472
采纳率:0%
帮助的人:1052万
展开全部
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()+"买票");

}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
知恩山难m
2020-02-04
知道答主
回答量:1
采纳率:0%
帮助的人:656
展开全部
package cn.kgc.tangcco.lxw;

public class Demo2 implements Runnable {
private int count = 10; // 总票数
private int num = 0; // 累计买的票数

public void run() {
while (true) {
System.out.println("");

synchronized (Demo22.class) {
if (count <= 0) {
break;
}
num++;
count--;

try {
Thread.sleep(60);
} catch (InterruptedException e) {
e.printStackTrace();

}

System.out.println(Thread.currentThread().getName() + "买的第" + num + "张票,剩余" + count + "张票");

}
}
}
}
**************************************************************

package cn.kgc.tangcco.lxw;

public class Demo22 {
public static void main(String[] args) {
Demo2 site = new Demo2();
Thread person1= new Thread(site,"lily");
Thread person2= new Thread(site,"lucy");
Thread person3= new Thread(site,"黄牛");
System.out.println("********买票情况********");
person1.start();
person2.start();
person3.start();
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式