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还是没有执行 展开
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还是没有执行 展开
展开全部
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个,达不到同步的目的。
如果还有不明白的,可以继续问。
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个,达不到同步的目的。
如果还有不明白的,可以继续问。
展开全部
run()方法不对,没有控制同步,如下修改:
public void run()
{
while(true)
{
synchronized(this){
if(number>0){
System.out.println("第"+number+"个人在"+Thread.currentThread().getName()+"买票");
number--;
}
}
}
}
public void run()
{
while(true)
{
synchronized(this){
if(number>0){
System.out.println("第"+number+"个人在"+Thread.currentThread().getName()+"买票");
number--;
}
}
}
}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
应该加一个同步的控制,否则可能几个线程同时访问number
把System.out.println("第"+number+"个人在"+Thread.currentThread().getName()+"买票");
number--;
这段放到一个加synchronized 修饰的函数中,再在run中调用,如果你在run中加锁的话,第一个访问的线程只有完全运行完while后才解锁,其他线程判断number为0就不执行while了。
把System.out.println("第"+number+"个人在"+Thread.currentThread().getName()+"买票");
number--;
这段放到一个加synchronized 修饰的函数中,再在run中调用,如果你在run中加锁的话,第一个访问的线程只有完全运行完while后才解锁,其他线程判断number为0就不执行while了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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()+"买票");
}
}
{
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()+"买票");
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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();
}
}
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();
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询