A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 莫道荣 中级黑马   /  2013-3-4 22:49  /  1784 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 莫道荣 于 2013-3-5 22:31 编辑

这个程序 我的意图是想让三个线程一共卖100张票,但是每次运行的时候总是一个线程将100张票全部卖完。我已经在

run()方法中加入了Thread.sleep(1000);语句,感觉程序遇到这句时应该当前线程休眠,其他线程执行,不应该只有一

个线程执行呀?求高人指点?

您的任何帮助,我将不尽感激。

package com.cbd.zhixiang;


public class ThreadDemo
{
public static void main(String[] args)
{
        Ticket t = new Ticket();
        new Thread(t).start();
        new Thread(t).start();
        new Thread(t).start();
}
}


class Ticket  implements Runnable
{
private int count = 100;


Object obj = new Object();
public void run()
{
synchronized (obj)
{

while (count > 0)
{
try
{
Thread.sleep(1000);
} catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "..."
+ count--);
}
}
}
}


评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

3 个回复

倒序浏览
修改下就能运行了
  1. public class ThreadDemo{
  2.         public static void main(String[] args){
  3.         Ticket t = new Ticket();
  4.         //创建对象并创建三个线程
  5.         new Thread(t).start();
  6.         new Thread(t).start();
  7.         new Thread(t).start();
  8.         }
  9. }


  10. class Ticket  implements Runnable{
  11.         private int count = 100;


  12.         Object obj = new Object();
  13.         public void run(){
  14.                 while (count > 0){
  15.                         try{
  16.                                 Thread.sleep(1000);
  17.                         }
  18.                         catch(InterruptedException e){
  19.                                 e.printStackTrace();
  20.                         }
  21.                         synchronized (obj){
  22.                                 //同步代码块的位置应该放在这,因为如果你把sleep()方法也扩进去的话,线程是在同步的时候sleep()其他线程也没有办法抢到锁来运行,所以结果才会一个线程运行
  23.                                 if(count > 0){
  24.                                         //在这里加一层判断,防止出现负票
  25.                                         System.out.println(Thread.currentThread().getName() + "..."+ count--);
  26.                                 }
  27.                         }
  28.                 }
  29.         }
  30. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

回复 使用道具 举报
class Test3
{
        public static void main(String[] args)
        {
                Ticket t=new Ticket();
                new Thread(t).start();
                new Thread(t).start();
                new Thread(t).start();
        }
}
class Ticket  implements Runnable
{
        private int count=100;
        Object obj = new Object();
        public void run()
        {
                System.out.println("多线程启动!");
                //synchronized (obj)//这一步,你的锁定义在这里,相当于定义在run方法上了,就完全是单线程了.
                //{
                        while (count > 0)
                        {
                                try
                                {Thread.sleep(10);} //线程在这里停多了.到最后票要卖完了.那么线程,还是会再卖一票,程序也会出错,
                                catch (InterruptedException e)
                                {e.printStackTrace();}
                                synchronized(obj)
                                {
                                        if(count>0)//加上一层判断,阻止票卖完了,还有沉睡的线程进来继续卖.
                                                System.out.println(Thread.currentThread().getName()+"..."+count--);
                                }
                        }
                //}
        }
}

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

回复 使用道具 举报
陈圳 发表于 2013-3-4 23:07
class Test3
{
        public static void main(String[] args)

哈哈,我两基本说的一模一样
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马