黑马程序员技术交流社区

标题: 一个初级线程的问题,望高手解决一下 [打印本页]

作者: 张龙欢    时间: 2013-5-23 22:50
标题: 一个初级线程的问题,望高手解决一下
本帖最后由 张龙欢 于 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。

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

}

作者: Sofoul    时间: 2013-5-23 23:24
本帖最后由 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();
}
}


作者: 陈潜    时间: 2013-5-24 01:12
首先说你程序的一个问题,,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.         }
复制代码

作者: 袁梦希    时间: 2013-5-24 01:27
楼主你好,如果问题以解决,请修改分类,谢谢合作。
\
作者: 吕振中    时间: 2013-5-24 09:48
这个结果正常
作者: 杨彬    时间: 2013-5-24 12:25
加锁啊 兄弟
作者: 张俊生    时间: 2013-5-24 13:57
用lock锁就行了,或者同步




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2