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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张龙欢 中级黑马   /  2013-5-23 22:50  /  1407 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张龙欢 于 2013-5-24 20:35 编辑

一个初级线程的问题,望高手解决一下-_#
一般来说对于下面的这段代码:
class   TicketSystem
{
public   static   void   main(String[]   args)
{
SellTicket   st   =   new   SellTicket();

new   Thread(st).start();
new   Thread(st).start();
new   Thread(st).start();
new   Thread(st).start();
}
}

class   SellTicket   implements   Runnable
{
int   tickets   =   100;
public   void   run()
{
while(true)
{
if(tickets   >   0)
{
System.out.println(Thread.currentThread().getName()   +   "   sell   ticket:   "   +   tickets);
tickets--;
}

}
}
}
出来的结果应该是:
Thread-0   sell   ticket:   100
Thread-0   sell   ticket:   99
Thread-3   sell   ticket:   98
...
Thread-1   sell   ticket:   1
但是我这里出来的结果却是:
Thread-0   sell   ticket:   10
Thread-0   sell   ticket:   99
Thread-3   sell   ticket:   99
Thread-3   sell   ticket:   98
Thread-2   sell   ticket:   99
Thread-2   sell   ticket:   96
Thread-2   sell   ticket:   95
...
Thread-1   sell   ticket:   7
Thread-3   sell   ticket:   8
Thread-0   sell   ticket:   5
Thread-0   sell   ticket:   4
Thread-0   sell   ticket:   3
Thread-2   sell   ticket:   6
Thread-1   sell   ticket:   1
Thread-3   sell   ticket:   2
看了老师人家的代码和我的一样,可是我的这个结果。。。
迷茫了半天了,请各位帮个忙吧。谢谢了!

对了,我这里用的是SUN公司的JDK   1.6.0_02。

评分

参与人数 1技术分 +1 收起 理由
HM汪磊 + 1

查看全部评分

8 个回复

倒序浏览
稍微解释一下
本程序涉及多线程,线程安全性问题。因为有共享资源票,四个线程,run方法有多条语句
所以存在线程安全问题,要想从100至一输出,必须加上同步代码块,或者同步函数
简单解决一下吧,
public   void   run()
{
while(true)
{
synchronized(Object.class){
if(tickets   >   0)
{
System.out.println(Thread.currentThread().getName()   +   "   sell   ticket:   "   +   tickets);
tickets--;
}

}

评分

参与人数 1技术分 +1 收起 理由
HM汪磊 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 Sofoul 于 2013-5-23 23:25 编辑

package thread;
public class TicketDemo implements Runnable{
private int ticket=100;

public void run(){
  while(true){
   
   if(ticket>0)
   
  System.out.println(Thread.currentThread().getName()+"正在售出的是第"+(ticket--)+"张票");
  }
  
}

}
package thread;
public class TicketDemoTest {
/**
  * @param args
  */
public static void main(String[] args) {
  TicketDemo t=new TicketDemo();
  Thread s=new Thread(t,"窗口1");
  Thread s1=new Thread(t,"窗口2");
  Thread s2=new Thread(t,"窗口3");
  s.start();
  s1.start();
  s2.start();
}
}

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1

查看全部评分

回复 使用道具 举报
首先说你程序的一个问题,,while(true)没有跳出
然后是多线程的安全问题:
  1.         public  void run() {
  2.                 boolean flag = true;//定义结束标签
  3.                 while (flag) {
  4.                         synchronized (Object.class) {//线程安全
  5.                                 if (tickets > 0) {
  6.                                         System.out.println(Thread.currentThread().getName()
  7.                                                         + "   sell   ticket:   " + tickets);
  8.                                         tickets--;
  9.                                 }else{
  10.                                         flag = false;
  11.                                 }
  12.                                 try {
  13.                                         Thread.sleep((int) (Math.random()*1000));//随机的睡眠一会
  14.                                 } catch (InterruptedException e) {
  15.                                         e.printStackTrace();
  16.                                 }
  17.                         }
  18.                 }
  19.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
楼主你好,如果问题以解决,请修改分类,谢谢合作。
\
回复 使用道具 举报
这个结果正常
回复 使用道具 举报
杨彬 中级黑马 2013-5-24 12:25:40
7#
加锁啊 兄弟
回复 使用道具 举报
用lock锁就行了,或者同步
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马